如何在不使用for循环的情况下在matlab中计算dyadics?

时间:2014-11-26 15:09:00

标签: matlab matrix vectorization

我想知道是否有人能帮我解决问题。

假设我在尺寸[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

提前致谢!

1 个答案:

答案 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 加速问题中列出的嵌套循环代码!