Re: fast replace for matrix minor
- To: mathgroup at smc.vnet.net
- Subject: [mg69511] Re: fast replace for matrix minor
- From: "astanoff" <astanoff at gmail.com>
- Date: Thu, 14 Sep 2006 06:56:30 -0400 (EDT)
- References: <ee8hcp$j7g$1@smc.vnet.net>
Christopher Arthur wrote: > Is there a quick way to replace a small minor block in a large matrix? > Using ReplacePart in a Do loop seems to be very inefficient with > respect to timing > > Chris Arthur Hi Chris, This is my way to do that kind of block replace without any Do, For or While : In[1]:=replaceBlock[oldMatrix_?MatrixQ, newBlock_?MatrixQ, {startRow_Integer, startColumn_Integer}]:= Module[{endRow, endColumn, rep}, {endRow, endColumn} = {startRow, startColumn}+ Dimensions[newBlock]-1; rep[i_ /; startRow <= i <= endRow, j_ /; startColumn <= j <= endColumn]:= newBlock[[i-startRow+1, j-startColumn+1]]; rep[i_,j_] := oldMatrix[[i,j]]; Array[rep, Dimensions[oldMatrix]] ]; Example : In[6]:=replaceBlock[Array[x,{10,5}],Array[y,{2,4}],{3,2}] Out[6]={{x[1,1],x[1,2],x[1,3],x[1,4],x[1,5]}, {x[2,1],x[2,2],x[2,3],x[2,4],x[2,5]}, {x[3,1],y[1,1],y[1,2],y[1,3],y[1,4]}, {x[4,1],y[2,1],y[2,2],y[2,3],y[2,4]}, {x[5,1],x[5,2],x[5,3],x[5,4],x[5,5]}, {x[6,1],x[6,2],x[6,3],x[6,4],x[6,5]}, {x[7,1],x[7,2],x[7,3],x[7,4],x[7,5]}, {x[8,1],x[8,2],x[8,3],x[8,4],x[8,5]}, {x[9,1],x[9,2],x[9,3],x[9,4],x[9,5]}, {x[10,1],x[10,2],x[10,3],x[10,4],x[10,5]}} hth [you to improve your timing...] Valeri