15

我有一个维度为nxn的矩阵K。我想创建一个维度为N x N的新块对角矩阵M,使其包含矩阵K的d块作为其对角线。

我会直接使用M = blkdiag(K,K,K)等。d更小。不幸的是,d非常大,我不想手动编写与blkdiag ()函数的参数完全相同的公式。

有没有更短、更聪明的方法来做到这一点?

4

5 回答 5

25

你可以使用kron它。

M = kron(X,Y)

返回 X 和 Y 的 Kronecker 张量积。结果是一个大数组,该数组由 X 和 Y 的元素之间的所有可能乘积形成。如果 X 是 m×n 且 Y 是 p×q,则kron(X,Y) 是 m*p×n*q。所以在你的情况下,这样的事情会做:

M = kron(eye(L),K)

L#的块。

于 2013-05-04T04:00:39.473 回答
3
tmp = repmat({K},d,1);
M = blkdiag(tmp{:});

你永远不应该使用 eval,或者不必要地进入 for 循环。Kron 是一种非常优雅的方式。只是想分享这个,因为它也有效。

于 2015-02-19T08:34:20.810 回答
2

以下应该有效:

d=5;K=眼睛(3);T = 细胞(1,d);

对于 j=1:d T{j} =K; 结尾

M = blkdiag(T{:})

于 2013-09-13T03:58:31.613 回答
0
s = 'A,';
s = repmat(s,[1,n2]);
s = ['B=blkdiag(', s(1:end-1),');'];
eval(s);

它可以比使用 kron-eye 更快。

于 2015-02-16T07:04:32.710 回答
0

“for”循环可能会有所帮助。喜欢:

M = k;
for i=1:N/n - 1
    M=blkdiag(M,k);
end
于 2018-03-06T15:01:38.943 回答