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

```

• Prev by Date: Re: untitled question
• Next by Date: Polar coordinates
• Previous by thread: Re: untitled question
• Next by thread: Matrix Operations in Mma