在Matlab上找到一个交集

时间:2018-06-07 15:38:52

标签: matlab line-intersection

我有两组数据曲线,x1,y1和x1,y2。 我希望找到这两条曲线之间的交点。但是,我没有x1,y1的等式。而且,当使用传统的交叉计算功能时,我得到的结果很少甚至没有,因为曲线在特定点上没有“完全”相交:它们几乎相交!

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

谢谢,

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

enter image description here

1 个答案:

答案 0 :(得分: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+点(取决于您的电脑),这将会很慢。

相关问题