2013-05-04 2 views
14

У меня есть матрица K размеров n x n. Я хочу, чтобы создать новый блок диагональную матрицу М размеров N х N, таким образом, что она содержит D блоков матрицы К, как его диагональ.MATLAB: Создайте блок-диагональную матрицу с тем же повторяющимся блоком

я бы непосредственно использовали М = ​​blkdiag (K, K, K), и т.д. имел д было меньше. К сожалению, d очень большой, и я не хочу вручную писать формулу с d точно такие же аргументы для функции blkdiag().

Есть ли более короткий, более умный способ сделать это?

ответ

21

вы можете использовать kron для этого.

M = kron(X,Y) 

возвращает тензорное произведение Кронекера X и Y. В результате получается большой массив формируется путем принятия всех возможных продуктов между элементами X и те из Y. Если X является т-с-п и Y является p-by-q, то kron (X, Y) является m * p-by-n * q. Так что в вашем случае что-то, как это будет делать:

M = kron(eye(L),K) 

с L на # блоков.

+0

Спасибо за подсказку @natan. Я попробовал пару комбинаций и понял, что следующее дает мне то, что я ищу - «M = kron (eye (d), K)' – steadyfish

2

Должно работать следующее:

d = 5; К = глаза (3); T = ячейка (1, d);

для j = 1: d T {j} = K; конец

М = ​​blkdiag (Т {:})

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

Это может быть быстрее, чем при использовании Крон глаз.

+0

Очень NB !!!!!!!!! –

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

Вы никогда не должны использовать eval или использовать ненужные петли. Kron - очень элегантный способ. Просто хотел поделиться этим, так как он также работает.

0

Возможно, цикл «для» может помочь. Нравится:

M = k; 
for i=1:N/n - 1 
    M=blkdiag(M,k); 
end 
Смежные вопросы