Re: Re: Replacing part of a matrix by another
- To: mathgroup at smc.vnet.net
- Subject: [mg5632] Re: [mg5621] Re: Replacing part of a matrix by another
- From: Allan Hayes <hay at haystack.demon.co.uk>
- Date: Wed, 1 Jan 1997 21:04:58 -0500
- Sender: owner-wri-mathgroup at wolfram.com
Lee <killough at convex.com>
in [mg5621] Re: Replacing part of a matrix by another
gives the following function for replacing a submatrix of a matrix
M by a matrix L starting at position pos.
SetAttributes[setsub,HoldFirst]
setsub[M_,L_,pos_] :=
Array[ ( M[[##2]] = L[[Sequence @@ #]] )&
[ {##}, Sequence @@ ({##}+pos-1) ] &,
Dimensions[L]
]
Here is a faster variant for Version 2.2 that uses MapIndexed
instead of Array and a much more direct and faster one using Version
3.0.
(see also Paul Abbott, Tricks of the Trade,The Mathematica Journal
Vol 6 Issue 4, Fall 1996, p20
SetAttributes[setsub2,HoldFirst]
setsub2[M_,L_,pos_] :=
MapIndexed[(M[[##2]] = #1)&[#1,Sequence@@(#2+pos-1)]&,
L,
{Length[pos]}
]
With Version 3.0
SetAttributes[setsub3,HoldFirst]
setsub3[M_,L_,pos_] := (M[[##]]=L)&@@ Range[pos,pos+ Dimensions[L]-1]
TIMINGS and CHECKS (all with Version 3.0)
set:= (M = Array[m,{5,5}]; L = Array[l,{3,3}];{p,q}={2,2};)
set
Do[setsub[M,L,{p,q}],{200}]//Timing//First
(M1=M);
2.35 Second
set
Do[setsub2[M,L,{p,q}],{200}]//Timing//First
M1==M
1.65 Second
True
set
Do[setsub3[M,L,{p,q}],{200}]//Timing//First
M1==M
0.366667 Second
True
Allan Hayes
hay at haystack.demon.co.uk
http://www.haystack.demon.co.uk