MathGroup Archive 2010

[Date Index] [Thread Index] [Author Index]

Search the Archive

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




  • Prev by Date: how to plot nminimized result
  • Next by Date: Re: How does Plot* functions know about range?
  • Previous by thread: how to plot nminimized result
  • Next by thread: Re: It would be nice to have DiagonalMatrix accept a matrix as building