MATLAB: создать матричную диагональную матрицу с одним и тем же повторяющимся блоком
У меня есть матрица K размеров n x n. Я хочу создать новую матричную диагональную матрицу M размеров N x N, такую, что она содержит d блоков матрицы K в качестве своей диагонали.
Я бы прямо использовал M = blkdiag (K, K, K) и т.д. был меньше. К сожалению, d очень большой, и я не хочу вручную писать формулу с d точно такими же аргументами для функции blkdiag().
Есть ли более короткий, более умный способ сделать это?
Ответы
Ответ 1
вы можете использовать kron
для этого.
M = kron(X,Y)
возвращает тензорное произведение Кронекера X и Y. Результатом является большой массив, образованный путем получения всех возможных произведений между элементами X и элементами Y. Если X является m-by-n и Y является p-by- q, то kron (X, Y) является m * p-by-n * q. Поэтому в вашем случае что-то вроде этого будет делать:
M = kron(eye(L),K)
с L
# блоков.
Ответ 2
Следующее должно работать:
д = 5; К = глаза (3); T = ячейка (1, d);
для j = 1: d T {j} = K;
конец
M = blkdiag (T {:})
Ответ 3
tmp = repmat({K},d,1);
M = blkdiag(tmp{:});
Вы никогда не должны использовать eval или использовать ненужные петли.
Крон очень элегантный.
Просто хотел поделиться этим, так как он также работает.
Ответ 4
s = 'A,';
s = repmat(s,[1,n2]);
s = ['B=blkdiag(', s(1:end-1),');'];
eval(s);
Это может быть быстрее, чем использование kron-eye.