如果我理解你想找到两点之间的最小距离。
如果 x1、y1、x2 和 y2 是矩阵/向量之间存在差异,那么我建议如下。
dist=sqrt((x2-x1).^2+(y2-y1).^2); %compute distance
[M,I] = min(dist); %find value of minimum distance and index
xf=x1(I); yf=y1(I); %this is the point on the first curve for the "intersection"
xs=x2(I); ys=y2(I); %this is the point on the second curve for the "intersection"
这应该做你想做的,因为它计算距离然后寻找最小值。现在正如评论中所说,我们还假设不同的 x 元素(不同的间距)和/或不同数量的元素。(x1 和 y1 必须具有相同的元素,否则您甚至无法绘制它,并且您需要“重新划分”您的网格/数据点)。
if length(x1)<length(x2)
l=length(x1);
c=length(x2);
xo=x1; xe=x2; yo=y1; ye=y2;
else
l=length(x2);
c=length(x1);
xo=x2; xe=x1; yo=y2; ye=y1;
end
dist=zeros(l,c);
for kk=1:l
xm=xo(kk)*ones(1,c); %you might have to change this depending on if your arrays are vertical/horizontal
ym=yo(kk)*ones(1,c); %same as xm but for y
dist(kk,:)=sqrt((xe-xm).^2+(ye-ym).^2); %compute distance
end
[M,I] = min(dist(:)); %find value of minimum distance and index
[row,col]=ind2sub(size(dist),I)
那么这是做什么的,它运行一个 for 循环最少的次数,每次迭代它都会检查其中一个的 1 个值与另一行的所有其他值。这意味着它计算所有点之间的所有距离。然后你再次找到最小距离并将位置转换为行号和列号,行告诉你最短数组的索引,列告诉你最长的索引(你可以添加一些东西来自动找到哪个是在 if 函数中或在末尾添加几行)。
正如另一位用户所提到的,对于 10000+ 或 100000+ 点的大型数据集(取决于您的电脑),这将很慢。