矢量化依赖嵌套循环

时间:2014-08-28 13:34:01

标签: matlab vectorization

我正在寻找一种有效的方法来使用MATLAB计算大小坐标矩阵(nodeCount x 2)中所有点之间的成对距离。我不希望两次计算成对距离(例如,节点1-2之间和节点2-1之间)。我已经构造了一个外部'for'循环,它通过每个节点递增,内部循环仅评估较高索引号的节点。结果是由节点间隔距离填充的上三角矩阵。我想对这些计算进行矢量化,或者至少提高此操作的效率。任何帮助,将不胜感激。

gap = 10;

for s = 1:(nodeCount); 
  for ss = s+1:(nodeCount);
    if abs(nodeCoord(s,1)-nodeCoord(ss,1)) < gap;
      sep(s,ss) = sqrt((nodeCoord(s,1)-nodeCoord(ss,1))^2+(nodeCoord(s,2)-nodeCoord(ss,2))^2);
    end
  end
end

4 个答案:

答案 0 :(得分:1)

循环并不真正依赖于持久性。我想你想找到所有其他坐标的距离试试这个:

xCoord = [1;2;3;4;5];
yCoord = [1;2;3;4;5]:
xSquare = bsxfun(@(x,y) power((x-y),2),xCoord,xCoord.');
ySquare = bsxfun(@(x,y) power((x-y),2),yCoord,yCoord.');
dist = sqrt(xSquare+ySquare);

答案 1 :(得分:1)

不是试图使用不需要下三角形元素的事实,因为它们在输出中是零,我认为你最好使用基于快速矩阵乘法的技术,如{{3}中所述。获得欧几里德距离的完整矩阵。要获得所需的上三角矩阵输出,可以使用triu包装输出。

接下来的代码是我们计算nodeCoord中同一对坐标之间距离的条件的略微修改版本。

<强>代码

numA = size(nodeCoord,1);
helpA = ones(numA,6);
helpB = ones(numA,6);
for idx = 1:2
    sqA_idx = nodeCoord(:,idx).^2;
    helpA(:,3*idx-1:3*idx) = [-2*nodeCoord(:,idx), sqA_idx ];
    helpB(:,3*idx-2:3*idx-1) = [sqA_idx , nodeCoord(:,idx)];
end
sep = triu(sqrt(helpA(:,1:3) * helpB(:,1:3)')<gap).* sqrt(helpA * helpB');

答案 2 :(得分:1)

xCoord = [1;2;3;4;5];
yCoord = [1;2;3;4;5];

dist = sqrt(pdist2(xCoord,yCoord,'euclidean'));

可以使用函数pdist2

答案 3 :(得分:0)

pdist(nodeCoord)以快速的方式完成,但是在向量中返回数据。将其映射回矩阵的成本与计算距离的时间大致相同:

sep3=zeros(nodeCount,nodeCount);
sep3(tril(true(nodeCount),-1))=pdist(nodeCoord);
sep3=sep3+sep3.';

如果您对下三角矩阵感到满意,可以省略最后一行。