我正在寻找一种有效的方法来使用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
答案 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.';
如果您对下三角矩阵感到满意,可以省略最后一行。