我有一个n
*m
矩阵,比如说A
。我想创建以下m
* m
*n
矩阵,比如说B
for j=1:n
B(:,:,j)=diag(A(j,:));
end
我如何做到这一点而不必循环?
谢谢
我有一个n
*m
矩阵,比如说A
。我想创建以下m
* m
*n
矩阵,比如说B
for j=1:n
B(:,:,j)=diag(A(j,:));
end
我如何做到这一点而不必循环?
谢谢
更新:我已经编辑了问题以修复示例代码中的拼写错误。
我相当确定您的示例代码包含几个拼写错误,因为目前矩阵A
没有任何用途,您的循环下标也没有j
。但是,您实际上想问的是:如何构建一个 3d 数组,其中每个对角线(沿第 3 维移动)都是来自 的一行A
,而不进行循环?
如果这是正确的,那么一个答案如下:
%# A loop-less solution
Soln2 = zeros(M, M, N);
Soln2(bsxfun(@plus, (1:M+1:M*M)', (0:M^2:(N-1)*M^2))) = A';
基本上我所做的只是预先分配解决方案 3d 数组,然后用于bsxfun
构造所有对角线的线性索引,沿第三维移动。然后我将(因为你想要行而不是列)的转置分配给A
解决方案数组中的线性索引。
请注意,我在下面粘贴了一些示例代码用于测试目的。请确认我对基于循环的解决方案的解释是您真正想要的。
%# Set some parameters and create a random matrix A
N = 3;
M = 4;
A = randi(5, N, M);
%# Your loop based solution
Soln1 = nan(M, M, N);
for n = 1:N
Soln1(:,:,n) = diag(A(n,:));
end
%# A loop-less solution
Soln2 = zeros(M, M, N);
Soln2(bsxfun(@plus, (1:M+1:M*M)', (0:M^2:(N-1)*M^2))) = A';