Re: Constructing matrix out of submatrices
- To: mathgroup at smc.vnet.net
- Subject: [mg113823] Re: Constructing matrix out of submatrices
- From: Raffy <adraffy at gmail.com>
- Date: Sun, 14 Nov 2010 06:10:19 -0500 (EST)
- References: <ibl9fa$b7l$1@smc.vnet.net>
On Nov 12, 9:59 pm, Patrick Scheibe <psche... at trm.uni-leipzig.de> wrote: > Hi, > > you could use ArrayPad > > CreateMatrix[sub_?MatrixQ, pos : {_, _}, finaldim : {_, _}] := > ArrayPad[sub, > Transpose[{pos - {1, 1}, > finaldim - Dimensions[sub] - pos + {1, 1}}]] > > CreateMatrix[{{a,b},{c,d}}, {1, 2}, {3, 3}] // MatrixForm > > Cheers > Patrick > > > > > > > > On Fri, 2010-11-12 at 05:26 -0500, Sebastian Schmitt wrote: > > Hi! > > > I would like to construct a matrix out of submatrices. I guess this is > > straight forward but somehow I couldn't find the correct way in the > > documentation. The example that follows is of course simplified. Please > > don't take shortcuts. > > > I start with a zero matrix and a submatrix: > > > matrix = ConstantArray[0, {3, 3}] > > submatrix = {{a, b}, {c, d}} > > > I want to specificy the upper-left corner in the matrix where the > > submatrix should be placed. If the position is {1,1} the result should = be: > > > result = {{a, b, 0}, {c, d, 0}, {0, 0, 0}} > > > If it is {1,2}: > > > result = {{0, a, b}, {0, c, d}, {0, 0, 0}} > > > etc. > > > ReplacePart together with ArrayFlatten comes close, but the submatrix > > does not "override" zeros: > > > ReplacePart[matrix, {1, 1} -> submatrix] // ArrayFlatten > > > {{a, b, 0, 0}, {c, d, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}} > > > What are possible solutions? > > > Thanks, > > > Sebastian A further generalization: With[{pDim = _Integer?NonNegative}, With[{pDims = pDim | {pDim, pDim}}, ClearAll[matmush]; matmush[size : pDims, mats : {(_[_?MatrixQ, pDims]) ...} : {}] := Fold[#1 + ArrayPad[#2[[1]], Transpose@{#2[[2]] - {1, 1}, 1 + size - Dimensions[#2[[1]]] - #2[[2]]}] &, ConstantArray[0, size*{1, 1}], mats]; ]; ]; matmush[{3, 5}, { {{a, b}, {c, d}} -> 1, {{1, 0}, {0, 1}} -> {2, 1}, Array[f, {3, 3}] -> {1, 4} }] // MatrixForm matmush[2] // MatrixForm matmush[5, {Array[f,{3,3} -> 2}] // MatrixForm