我有一个3d数组A,例如A = rand(N,N,K)。
我需要一个数组B。
B(n,m) = norm(A(:,:,n)*A(:,:,m)' - A(:,:,m)*A(:,:,n)','fro')^2 for all indices n,m in 1:K.
这是循环代码:
B = zeros(K,K);
for n=1:K
for m=1:K
B(n,m) = norm(A(:,:,n)*A(:,:,m)' - A(:,:,m)*A(:,:,n)','fro')^2;
end
end
我不想循环到1:K。
我可以创建大小为N K x N K s.t的数组An_x_mt。
An_x_mt equals A(:,:,n)*A(:,:,m)' for all n,m in 1:K by
An_x_mt = Ar*Ac_t;
与
Ac_t=reshape(permute(A,[2 1 3]),size(A,1),[]);
Ar=Ac_t';
如何创建尺寸也为N K x N K s.t的数组Am_x_nt。
Am_x_nt equals A(:,:,m)*A(:,:,n)' for all n,m in 1:K
这样我就可以
B = An_x_mt - Am_x_nt
B = reshape(B,N,N,[]);
B = reshape(squeeze(sum(sum(B.^2,1),2)),K,K);
Thx
答案 0 :(得分:0)
对于那些不能/不会使用mmx并希望坚持使用纯Matlab代码的人,这是您可以做到的。 mat2cell和cell2mat函数是您的朋友:
reword
或者,在计算Anmt_2d_cell和Amnt_2d_cell之后,您可以使用第3维将它们转换为3d,对(n,m)和(m,n)索引进行编码,然后在3d中进行其余的计算。您将需要https://www.mathworks.com/matlabcentral/fileexchange/7147-permn-v-n-k
处的permn()实用程序git log --show-signature
由于某种原因,第二个选项(3D阵列)的速度快了两倍。
希望这会有所帮助。