如何在matlab中向量化两个for循环以加快速度

时间:2014-06-06 02:41:36

标签: matlab loops vectorization

如何通过MATLAB中的矢量化加速下面的两个for循环?这是迭代算法的一部分,我需要多次这样做。

Temp1=0;
Temp2=0;

for i=1:m_plus
    for j=1:m_minus
        Temp1=Temp1+(p_m(j,:)-p_p(i,:))';
        Temp2=Temp2+(p_m(j,:)-p_p(i,:))'*(p_m(j,:)-p_p(i,:));
    end
end

2 个答案:

答案 0 :(得分:2)

假设

m_plus = size(p_p,1);
m_minus = size(p_m,1);

然后很容易做Temp1没有循环

Temp1 = (m_plus*sum(p_m)-m_minus*sum(p_p))'

对于Temp2,它很容易摆脱其中一个循环,

Temp2 = 0;
for idx = 1:m_plus
    temp = p_m-ones(m_minus,1)*p_p(idx,:); % or could use bsxfun to do this
    Temp2 = Temp2 + temp'*temp;
end

虽然稍微考虑一下,也有可能摆脱这种循环。

答案 1 :(得分:0)

另一种矢量化方法,其灵感来自Phil's smart answer -

t1 = bsxfun(@minus,p_m,permute(p_p,[3 2 1]));
t2 = reshape(permute(t1,[1 3 2]),m_minus*m_plus,[]);
Temp1 = sum(t2)'; %//'
Temp2 = t2'*t2;