It would be nice to have DiagonalMatrix accept a matrix as building
- To: mathgroup at smc.vnet.net
- Subject: [mg113509] It would be nice to have DiagonalMatrix accept a matrix as building
- From: "Nasser M. Abbasi" <nma at 12000.org>
- Date: Sun, 31 Oct 2010 04:18:48 -0500 (EST)
- Reply-to: nma at 12000.org
Sometime there is a need to make a matrix with repeating subblocks on the diagonal. For example, one might want to create matrix A, with matrix B on its diagonal, repeated n times. DiagonalMatrix only accepts vector (list), not matrix (list of lists), as its argument. So, one has the option to use DiagonalMatrix, repeatedly, using different offsets at a time, and manually layout the diagonal. Or use SparseArray since SparseArray accepts a matrix as the band, but also make a loop to add the block at different locations on the diagonal. The SparseArray method is little less work, but I think a nice solution would be to have the ability to specify the block, and how many time it needs to be repeated on the diagonal. That other 'system' has this command to do that. This is how I now create a diagonalMatrix with matrices at its diagonal. Maybe an expert here knows of a short way or trick to use. In this example, I wanted to make matrix 'a' with the submatrix {{1,2}{3,4}} on its diagonal, and wanted this repeated 6 times. So, I made a large cup of coffee, sat down and wrote this ---------------------------- block={{1,2},{3,4}}; sizeOfBlock=Length[block]; nBlocks=6; a=Table[0,{i,sizeOfBlock*nBlocks},{j,sizeOfBlock*nBlocks}]; Do[ a=a+Normal@SparseArray[Band[{i*sizeOfBlock+1,i*sizeOfBlock+1}]->block,nBlocks*sizeOfBlock], {i,0,nBlocks-1} ]; -------------------------- {{1,2,0,0,0,0,0,0,0,0,0,0},{3,4,0,0,0,0,0,0,0,0,0,0}, {0,0,1,2,0,0,0,0,0,0,0,0},{0,0,3,4,0,0,0,0,0,0,0,0}, {0,0,0,0,1,2,0,0,0,0,0,0},{0,0,0,0,3,4,0,0,0,0,0,0}, {0,0,0,0,0,0,1,2,0,0,0,0},{0,0,0,0,0,0,3,4,0,0,0,0}, {0,0,0,0,0,0,0,0,1,2,0,0},{0,0,0,0,0,0,0,0,3,4,0,0}, {0,0,0,0,0,0,0,0,0,0,1,2},{0,0,0,0,0,0,0,0,0,0,3,4}} So, it works. But if what I had imagined existed, I should have been able to do DiagonalMatrix[block,0,6] Again, the above command would only work if 'block' was a 1-D list, not a 2-D list (ie. a matrix). of course, I can make a function and hide the code I wrote inside this function, and it would just look the same as the call that I wanted. All what I am saying is that Mathematica should support this feature as part of DiagonalMatrix as it is very common thing. thanks --Nasser