Re: Block diagonal systems
- To: mathgroup at smc.vnet.net
- Subject: [mg13600] Re: Block diagonal systems
- From: Paul Abbott <paul at physics.uwa.edu.au>
- Date: Fri, 7 Aug 1998 03:08:05 -0400
- Organization: University of Western Australia
- References: <6puia4$6t2@smc.vnet.net> <6q3qq1$f1n@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
Rolf Mertig wrote: > 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]; Nice solution. As a slight improvement, you can replace mat_List /; And @@ (MatchQ[Dimensions[#1], {_, _}] & ) /@ mat with mat:{_?MatrixQ..} Cheers, Paul ____________________________________________________________________ Paul Abbott Phone: +61-8-9380-2734 Department of Physics Fax: +61-8-9380-1014 The University of Western Australia Nedlands WA 6907 mailto:paul at physics.uwa.edu.au AUSTRALIA http://www.physics.uwa.edu.au/~paul God IS a weakly left-handed dice player ____________________________________________________________________