Re: Block diagonal systems
- To: mathgroup at smc.vnet.net
- Subject: [mg13592] Re: Block diagonal systems
- From: Rolf Mertig <rolf at mertig.com>
- Date: Mon, 3 Aug 1998 03:53:52 -0400
- Organization: Mertig Research & Consulting
- References: <6puia4$6t2@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
michael ringor wrote:
> Hello: Does anyone have an efficient way of creating a block
> diagonal matrix, where the matrices along the diagonal are
> identical m by n matrices? I'm looking for some sort of
> generalization to DiagonalMatrix[list] where list is sequence of
> compatible matrices, instead of a scalar list.
>
> Michael Ringor
> Purdue University
One possibility is:
In[1]:= BlockDiagonalMatrix[mat_List /;
And @@ (MatchQ[Dimensions[#1], {_, _}] & ) /@ mat, fillit_:0] :=
Module[{b = {0,0}, f, m}, f[{x_,y_}][e_, {r_, s_}] :=
Set @@ {m[r + x, s + y], e};
Do[MapIndexed[f[b], mat[[i]], 2]; b+= Dimensions[mat[[i]]],
{i, Length[mat]}]; Array[m, b] /. m[_, _] -> fillit];
In[2]:= BlockDiagonalMatrix[{{{1,2},{3,4}},{{1,2},{3,4}}}]//MatrixForm
Out[2]//MatrixForm=
1 2 0 0
3 4 0 0
0 0 1 2
0 0 3 4
In[3]:=
BlockDiagonalMatrix[{{{1,2},{3,4},{5,6}},{{x,x},{x,x}},{{u}}}]//MatrixForm
Out[3]//MatrixForm=
1 2 0 0 0
3 4 0 0 0
5 6 0 0 0
0 0 x x 0
0 0 x x 0
0 0 0 0 u
Rolf