I'm not sure but I think it's just a matter of convention how the elements
are arranged.
But your modifications are certainly correct if you want to obtain the
direct product as defined by MathWorld.
Viktor
-----Original Message-----
From: maxima-admin@math.utexas.edu [mailto:maxima-admin at math] On
Behalf Of Prevett, Larry
Sent: Saturday, August 28, 2004 3:43 PM
To: maxima@math.utexas.edu
Subject: RE: [Maxima] direct product
|for what it's worth, I don't think there's a built-in direct matrix product
|in Maxima, but you can easily define your own solution. For instance, I
|believe the following function will do what you expect:
Hi Viktor,
I'm not absoultely sure, but I think that
|P:ZEROMATRIX(LENGTH(A)*LENGTH(A[1]),LENGTH(B)*LENGTH(B[1])),
should be something like
P:ZEROMATRIX(LENGTH(A)*LENGTH(B),LENGTH(A[1])*LENGTH(B[1])),
and
|P[(i-1)*LENGTH(A[1])+j,(k-1)*LENGTH(B[1])+l]:A[i,j]*B[k,l],
should be something like
P[k+length(B)*(i-1),l+length(B[1])*(j-1) ]:A[i,j]*B[k,l],
apologies if my thinking is wrong.
----------
So the function would be,
directprod(A,B):=([P],
IF NOT (MATRIXP(A) AND MATRIXP(B)) THEN
ERROR("Invalid arguments to DIRECTPROD()")
ELSE
P:ZEROMATRIX(LENGTH(A)*LENGTH(B),LENGTH(A[1])*LENGTH(B[1])),
FOR i THRU LENGTH(A) DO
FOR j THRU LENGTH(A[1]) DO
FOR k THRU LENGTH(B) DO
FOR l THRU LENGTH(B[1]) DO
P[k+length(B)*(i-1),l+length(B[1])*(j-1) ]:A[i,j]*B[k,l],
P
);
If I understand the direct produce and what is being computed,
for two matrices,
A:matrix([1,2],[3,4]);
[ 1 2 ]
[ 3 4 ]
B:matrix([0,1],[1,0]);
[ 0 1 ]
[ 1 0 ]
direct product a*b is
matrix([a[1,1]*b,a[1,2]*b],[a[2,1]*b,a[2,2]*b]);
[ [ 0 1 ] [ 0 2 ] ]
[ [ ] [ ] ]
[ [ 1 0 ] [ 2 0 ] ]
[ ]
[ [ 0 3 ] [ 0 4 ] ]
[ [ ] [ ] ]
[ [ 3 0 ] [ 4 0 ] ]
direct product b*a is
matrix([b[1,1]*a,b[1,2]*a],[b[2,1]*a,b[2,2]*a]);
[ [ 0 0 ] [ 1 2 ] ]
[ [ ] [ ] ]
[ [ 0 0 ] [ 3 4 ] ]
[ ]
[ [ 1 2 ] [ 0 0 ] ]
[ [ ] [ ] ]
[ [ 3 4 ] [ 0 0 ] ]
I checked the above routine for directproduct(A,B) and
directproduct(B,A) for
a:matrix([1,2],[3,4]);
b:matrix([0,1],[1,0]);
a:matrix([1,2],[3,4]);
b:matrix([0,1,1],[1,0,1]);
a:matrix([1,2],[3,4]);
b:matrix([1,1,0],[0,1,1],[1,0,1]);
Can someone verify or correct my thinking?
lp
_______________________________________________
Maxima mailing list
Maxima@www.math.utexas.edu
http://www.math.utexas.edu/mailman/listinfo/maxima