473 views (last 30 days)

I have a problem where I'm trying to create a matrix of the form

[A B 0 0; 0 A B 0; 0 0 A B; 0 0 0 A];

However, this is in block matrix notation. That means all of the elements are matrices of appropriate size so that this concatenation works. I saw the blkdiag function, but it doesn't look like it's going to work for this, because the elements overlap in certain columns.

For example, if A = [1 1] and B = [2 2] this matrix would look like:

[1 1 2 2 0 0 0 0; 0 0 1 1 2 2 0 0; 0 0 0 0 1 1 2 2; 0 0 0 0 0 0 1 1]

Does anyone have any suggestions how to do this in a parsimonious way?

Hang Qian
on 6 May 2016

Hello,

If the FOR loop is not your choice, you may consider the following:

>> A = [1 1];

>> B = [2 2];

>> C = blkdiag(A,A,A,A);

>> C(1:end-1,3:end) = C(1:end-1,3:end) + blkdiag(B,B,B)

If you’d like something slightly more general,

>> nrow=2;ncol=3;

>> A=rand(nrow,ncol);B=rand(nrow,ncol);

>> C = blkdiag(A,A,A,A);

>> C(1:end-nrow,ncol+1:end) = C(1:end-nrow,ncol+1:end) + blkdiag(B,B,B)

Regards,

- Hang Qian

Mark Britten-Jones
on 14 Mar 2019

This is by far the easiest way to do this. Create the blocks. Create a 2-D cell array and place the blocks into the appropriate cells. And then convert to a matrix by cell2mat. I have used this where I have used loops over the cell blocks to create quite complicated matrices and you do not have to worry about the indexes at the matrix level. Bonus! See the cell2mat documenation for rules regarding permissable block sizes. (They do not all have to be of the same size.)

A = [1 1];

B = [2 2];

Z = [ 0 0]

Ccell = {A, B, Z, Z; Z, A, B, Z; Z, Z, A, B; Z, Z, Z, A};

C = cell2mat(Ccell);

Jon
on 4 Apr 2019

Actually in the example you give it is not necessary to use the cell arrays at all. You can directly assign:

C =[A B Z Z;Z A B Z;Z Z A B;Z Z Z A]

Opportunities for recent engineering grads.

Apply Today
## 2 Comments

## Direct link to this comment

https://nl.mathworks.com/matlabcentral/answers/282817-creating-a-block-matrix-of-matrices#comment_364282

⋮## Direct link to this comment

https://nl.mathworks.com/matlabcentral/answers/282817-creating-a-block-matrix-of-matrices#comment_364282

## Direct link to this comment

https://nl.mathworks.com/matlabcentral/answers/282817-creating-a-block-matrix-of-matrices#comment_364520

⋮## Direct link to this comment

https://nl.mathworks.com/matlabcentral/answers/282817-creating-a-block-matrix-of-matrices#comment_364520

Sign in to comment.