0

我有两组数据曲线,x1,y1 和 x1,y2。我希望找到这两条曲线之间的交点。但是,我没有 x1,y1 的方程。此外,当使用传统的交点计算功能时,我几乎没有得到任何结果,因为曲线不会“完全”在特定点相交:它们几乎相交!

我想找到,对于可能的最小 x1,在 x1 点这些曲线彼此非常接近(几乎相交)。但是,我不确定如何继续......我确定我需要定义一个边距,但是我如何检查值 y1 和 y2 是否彼此接近并确定每个 x1 ?你有什么主意吗 ?你能想到什么功能?

谢谢,

这是我的两条曲线:曲线几乎相交

在此处输入图像描述

4

1 回答 1

1

如果我理解你想找到两点之间的最小距离。

如果 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+ 点的大型数据集(取决于您的电脑),这将很慢。

于 2018-06-07T15:48:48.707 回答