【发布时间】:2018-08-19 09:01:23
【问题描述】:
我有一个 3d 数组 A,例如A=rand(N,N,K)。
我需要一个数组 B s.t.
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。
我可以创建一个大小为 NK x NK 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';
如何创建大小为 NK x NK 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);
谢谢
【问题讨论】:
-
"我不想循环 1:K。"为什么不?您确定这是您代码中的瓶颈吗?你确定没有循环会更快吗?你对
reshape和permute所做的任何事情都比循环更难阅读,因此维护成本更高。 -
是的,这是一个主要瓶颈。数组乘法更快
-
这是 Frobenius 范数 mathworld.wolfram.com/FrobeniusNorm.html 矩阵绝对值平方和
-
问题是如何在不循环的情况下计算 Am_x_nt(n,m) = A(:,:,m)*A(:,:,n)'。