我想知道是否有人能帮我解决问题。
假设我在尺寸[M,N,3]的张量r中具有MxN向量的坐标。我想在3M-by-3N块矩阵中保存所有二元产品r_0'* r_0,其中r_0是一些m和n的向量r_0 = r(m,n,:),我想这样做不使用for循环。
如果没有正确解释自己,这里有一个示例代码,显示我想要获取的内容(当然,使用for循环):
N=10;
M=5;
r=rand(M,N,3);
Dyadic=zeros(3*M,3*N);
for m=1:M
a1=3*m-2;
a2=3*m;
for n=1:N
b1=3*n-2;
b2=3*n;
aux(3)=r(m,n,3);
aux(2)=r(m,n,2);
aux(1)=r(m,n,1);
Dyadic(a1:a2,b1:b2)=transpose(aux)*aux
end
end
提前致谢!
答案 0 :(得分:1)
您需要使用bsxfun(@times
,然后重新排列元素以获得所需的输出 -
%// Get the multipliication result
mat_mult = bsxfun(@times,permute(r,[1 2 4 3]),r);
%// OR if you would like to keep mat_mult as 3D that could be potentially faster -
%// mat_mult = bsxfun(@times,reshape(r,[],3),permute(reshape(r,[],3),[1 3 2]));
%// Re-arrange elements to have them the way you are indexing in nested loops
Dyadic = reshape(permute(reshape(mat_mult,M,N,3,[]),[3 1 4 2]),M*3,N*3);
关于这个解决方案的主要作用是在我们得到乘法结果后重新排列元素。
使用输入r
作为1000 x 1000 x 3
大小的数组 快速运行时测试,表明这种基于bsxfun
的方法优先于 20x
加速问题中列出的嵌套循环代码!