Matlab中不带循环的张量乘法

时间:2018-08-19 09:01:23

标签: matlab loops tensor

我有一个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

1 个答案:

答案 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阵列)的速度快了两倍。

希望这会有所帮助。