【发布时间】:2013-05-04 03:44:55
【问题描述】:
我有一个尺寸为 n x n 的矩阵 K。我想创建一个尺寸为 N x N 的新块对角矩阵 M,使其包含 d 个矩阵块 K 作为它的对角线。
如果 d 更小,我会直接使用 M = blkdiag(K,K,K) 等。不幸的是,d 非常大,我不想手动编写具有 d 与 blkdiag() 函数的参数完全相同的公式。
有没有更短、更智能的方法来做到这一点?
【问题讨论】:
标签: matlab matrix vectorization
我有一个尺寸为 n x n 的矩阵 K。我想创建一个尺寸为 N x N 的新块对角矩阵 M,使其包含 d 个矩阵块 K 作为它的对角线。
如果 d 更小,我会直接使用 M = blkdiag(K,K,K) 等。不幸的是,d 非常大,我不想手动编写具有 d 与 blkdiag() 函数的参数完全相同的公式。
有没有更短、更智能的方法来做到这一点?
【问题讨论】:
标签: matlab matrix vectorization
您可以为此使用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 是块数。
【讨论】:
M = kron(eye(d),K)
tmp = repmat({K},d,1);
M = blkdiag(tmp{:});
你不应该使用 eval,或者不必要地进入 for 循环。 Kron 是一种非常优雅的方式。 只是想分享这个,因为它也有效。
【讨论】:
Kron快:K=rand(3);tic;G = kron(eye(2000),K);toc经过的时间是0.122015秒。 ` tic;tmp = repmat({K},2000,1);M = blkdiag(tmp{:});toc` 经过的时间是 0.036623 秒。
以下应该有效:
d=5; K=眼睛(3); T = 单元格(1,d);
对于 j=1:d T{j} =K; 结束
M = blkdiag(T{:})
【讨论】:
s = 'A,';
s = repmat(s,[1,n2]);
s = ['B=blkdiag(', s(1:end-1),');'];
eval(s);
它可以比使用 kron-eye 更快。
【讨论】:
“for”循环可能会有所帮助。喜欢:
M = k;
for i=1:N/n - 1
M=blkdiag(M,k);
end
【讨论】: