我有一个尺寸为 n x n 的矩阵K。 我想创建一个新的块对角线矩阵,其尺寸为 N x N,它包含 d 个矩阵K块作为其对角线。
如果d较小,我可以直接使用 M = blkdiag(K,K,K)等方式。不幸的是,d非常大,我不想手动编写具有确切相同参数的 blkdiag()函数公式。
有没有更简短、更智能的方法来实现这个?
我有一个尺寸为 n x n 的矩阵K。 我想创建一个新的块对角线矩阵,其尺寸为 N x N,它包含 d 个矩阵K块作为其对角线。
如果d较小,我可以直接使用 M = blkdiag(K,K,K)等方式。不幸的是,d非常大,我不想手动编写具有确切相同参数的 blkdiag()函数公式。
有没有更简短、更智能的方法来实现这个?
你可以使用 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
表示块的数量。
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 秒。 - Youwei Liangd = 5; K = eye(3); T = cell(1, d);
for j = 1:d T {j} = K; end
M = blkdiag (T {:})
M = k;
for i=1:N/n - 1
M=blkdiag(M,k);
end
s = 'A,';
s = repmat(s,[1,n2]);
s = ['B=blkdiag(', s(1:end-1),');'];
eval(s);
使用 kron-eye 可能比其他方法更快。
M = kron(eye(d),K)
。 - steadyfish