Matrix Operations in Mma
- To: mathgroup at yoda.physics.unc.edu
- Subject: Matrix Operations in Mma
- From: Mark E. Fisher <m1mef00 at frb.gov>
- Date: Fri, 08 Oct 93 10:59:48 -0400
Following up on
>> How can I assign a matrix to a part of another matrix
Here is a one-liner, preceded by an easier to read, broken-up version with
some error checking built in:
---------------------------------------------------------------------------
(* code to insert tabA (smaller matrix) into slotB (larger matrix) *)
MatrixInsert::usage = "MartixInsert[tabA, slotB, {row, col}] inserts tabA into
slotB at position {row, col}."
MatrixInsert::willnotfit = "`1` will not fit in `2` at position {`3`, `4`}"
MatrixInsert[tabA:{_List ..}, slotB:{_List ..},
{row_Integer?Positive, col_Integer?Positive}] :=
Module[{tabrow, tabcol, takerows, newrows},
{tabrow, tabcol} = Dimensions[tabA];
(* check bounds *)
If[And @@ Thread[{row, col} + {tabrow, tabcol} <= Dimensions[slotB] + 1],
(* get rows to be changed *)
takerows = Take[slotB, {row, row + tabrow - 1}];
(* drop old column entries and insert new column entries *)
newrows = MapThread[MapAt[Apply[Sequence, #]&,
(* remove outer List from new cols *)
Insert[Drop[#1, {col, col + tabcol - 1}], #2, col], col]&,
{takerows, tabA}];
(* drop old rows and insert new rows *)
MapAt[Apply[Sequence, #]&, (* remove outer List from new rows *)
Insert[Drop[slotB, {row, row + tabrow - 1}], newrows, row], row],
(* else, bad bounds *)
Message[MatrixInsert::willnotfit, tabA, slotB, row, col]]]
(* all in one line, but less clear *)
MatrixInsertOneLiner[tabA_, slotB_, {row_, col_}] :=
With[{tabrow = Length[tabA], tabcol = Length[First[tabA]]},
MapAt[Apply[Sequence, #]&,
Insert[Drop[slotB, {row, row + tabrow - 1}],
MapThread[
MapAt[Apply[Sequence, #]&,
Insert[Drop[#1, {col, col +
tabcol - 1}], #2,
col],
col]&,
{Take[slotB, {row, row + tabrow - 1}], tabA}],
row],
row]]
---------------------------------------------------------------------------
Example:
tabA = Array[a, {4, 4}]
slotB = Array[b, {7, 7}]
MatrixInsert[tabA, slotB, {2, 3}]
Mark Fisher
Trading Risk Analysis
Federal Reserve Board
mfisher at frb.gov