MATLAB: Create a block diagonal matrix with same repeating block

I have a matrix K of dimensions n x n. I want to create a new block diagonal matrix M of dimensions N x N, such that it contains d blocks of matrix K as its diagonal.

I would have directly used M = blkdiag(K,K,K) etc. had d been smaller. Unfortunately, d is very large and I don't want to manually write the formula with d exactly same arguments for the blkdiag() function.

Is there any shorter, smarter way to do this?

5 Answers

you can use kron for that.

M = kron(X,Y)

returns the Kronecker tensor product of X and Y. The result is a large array formed by taking all possible products between the elements of X and those of Y. If X is m-by-n and Y is p-by-q, then kron(X,Y) is m*p-by-n*q. So in your case something like this will do:

M = kron(eye(L),K)

with L the # of blocks.

1
tmp = repmat({K},d,1);
M = blkdiag(tmp{:});

You should never use eval, or go into for loops unnecessarily. Kron is a very elegant way. Just wanted to share this as it also works.

1

The following should work:

d=5; K=eye(3); T = cell(1,d);

for j=1:d T{j} =K; end

M = blkdiag(T{:})

s = 'A,';
s = repmat(s,[1,n2]);
s = ['B=blkdiag(', s(1:end-1),');'];
eval(s);

It can be faster than using kron-eye.

0

A "for" loop may might help. Like:

M = k;
for i=1:N/n - 1 M=blkdiag(M,k);
end

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

You Might Also Like