Re: DirectSum (feature request)

*To*: mathgroup at smc.vnet.net*Subject*: [mg97827] Re: DirectSum (feature request)*From*: ADL <alberto.dilullo at tiscali.it>*Date*: Mon, 23 Mar 2009 04:02:09 -0500 (EST)*References*: <gq2eu9$ech$1@smc.vnet.net>

Maris, from Raffy clever analysis, I would do this: Unprotect[DiagonalMatrix]; DiagonalMatrix[vComp_?(VectorQ[#, MatrixQ] &)] := ArrayFlatten@ReleaseHold@DiagonalMatrix[Hold /@ vComp]; Protect[DiagonalMatrix]; This might be the "permanent" fix (and the fastest one) you were looking for, waiting for a kind develper to implement it natively. ADL On 21 Mar, 11:18, Maris Ozols <maroz... at gmail.com> wrote: > Taking a direct sum of a given list of matrices is a very common task > (unless you are a quantum physicist and use only KroneckerProduct). > Unfortunately there is no built-in function (that I know of) for doing > this in Mathematica. The closest thing we have is ArrayFlatten. So I > usually do something like this to compute a direct sum: > > DirectSum[Ms_] := Module[{n = Length[Ms], z, i}, > z = ConstantArray[0, n]; > ArrayFlatten@Table[ReplacePart[z, i -> Ms[[i]]], {i, 1, n}] > ]; > > Is there a better way of doing this? > > Note: A nice way to implement it would be > > DirectSum[Ms_] := ArrayFlatten@DiagonalMatrix[Ms]; > > Unfortunately this gives "DiagonalMatrix::vector" error, since > DiagonalMatrix is not flexible enough to accept a list of matrices. > The way DiagonalMatrix is used in the above code might cause some > confusion for beginners, but in general I don't see why DiagonalMatrix > should be limited in this way. > > ~Maris Ozols~