如何通过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
答案 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;