我有一个维度为nxn的矩阵K。我想创建一个维度为N x N的新块对角矩阵M,使其包含矩阵K的d块作为其对角线。
我会直接使用M = blkdiag(K,K,K)等。d更小。不幸的是,d非常大,我不想手动编写与blkdiag ()函数的参数完全相同的公式。
有没有更短、更聪明的方法来做到这一点?
我有一个维度为nxn的矩阵K。我想创建一个维度为N x N的新块对角矩阵M,使其包含矩阵K的d块作为其对角线。
我会直接使用M = blkdiag(K,K,K)等。d更小。不幸的是,d非常大,我不想手动编写与blkdiag ()函数的参数完全相同的公式。
有没有更短、更聪明的方法来做到这一点?
你可以使用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
#的块。
tmp = repmat({K},d,1);
M = blkdiag(tmp{:});
你永远不应该使用 eval,或者不必要地进入 for 循环。Kron 是一种非常优雅的方式。只是想分享这个,因为它也有效。
以下应该有效:
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