Matrix Operations in Mma
- To: mathgroup at yoda.physics.unc.edu
- Subject: Matrix Operations in Mma
- From: Count Dracula <lk3a at kelvin.seas.virginia.edu>
- Date: Sun, 3 Oct 1993 22:42:47 -0400
In response to Martin Rickli who writes
>> How can I assign a matrix to a part of another matrix?
I have below two modules, assign2 and assign3, with identical input arguments:
A = the larger matrix which will have parts of it reassigned
alist = the smaller matrix which will be inserted into A
begrow = the number of the first row in A where elements from alist
will be inserted
begcol = the number of the first column in A where elements from alist
will be inserted
The difference between the modules is that assign2 creates a new matrix and uses
ReplacePart while assign3 changes the matrix A in the right places without forming
another matrix. Here's a test program to compare results and times
________________________________________________________________________________
A = IdentityMatrix[90]
B = A
row = {a, b, c, d, e, f, g, P, Q, R}
alist = Array[ row &, 50 ]
assign2[A_, alist_, begrow_, begcol_] :=
Module[{ rows, cols, index, flist },
rows = Range[begrow, begrow + Length[alist] - 1];
cols = Range[begcol, begcol + Length[ alist[[1]] ] - 1];
index = Flatten[ Outer[ List, rows, cols ], 1 ];
flist = Transpose[ {Flatten[alist], index} ];
Fold[ ReplacePart[#1, Sequence @@ #2] &, A, flist ]
]
Attributes[assign3] = {HoldFirst}
assign3[A_, alist_, begrow_, begcol_] :=
Module[{ rows, cols, index, flist },
rows = Range[begrow, begrow + Length[alist] - 1];
cols = Range[begcol, begcol + Length[ alist[[1]] ] - 1];
index = Flatten[ Outer[ List, rows, cols ], 1 ];
flist = Transpose[ Append[ Transpose[index],Flatten[alist] ] ];
Apply[(A[[#1, #2]] = #3) & , flist, 1];
Null
]
t2 = Timing[A = assign2[A, alist, 2, 3]];
t3 = Timing[assign3[B, alist, 2, 3]];
{ t2[[1]], t3[[1]], A==B }
________________________________________________________________________________
This test program with Version 2.2 on an RS6000 gives
Out[1]= {1.06 Second, 0.24 Second, True}
and in all other tests, with some other modules, assign3 reported the least time.
It is of course somewhat Fortran-like in its final line. I would like to hear
from people who have suggestions for improvement.
Levent
lk3a at kelvin.seas.virginia.edu