Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在MATLAB中画出通过大多数给定点的完美直线?_Matlab_Line - Fatal编程技术网

如何在MATLAB中画出通过大多数给定点的完美直线?

如何在MATLAB中画出通过大多数给定点的完美直线?,matlab,line,Matlab,Line,有人能帮我找出如何从通过这些点的大多数(可能是20个点中的5-6个点)的给定点集合中画出一条完美的直线吗?请注意,这不是直线拟合问题,但应在大多数给定点之间绘制完美的直线(水平、垂直或稍微倾斜) 以下是MATLAB代码: e=[16116219319515540106102125155189192186188185186147148180183]; f=[138 92 92 115 258 124 218 114 125 232 431 252 539 463 643 571 582 726

有人能帮我找出如何从通过这些点的大多数(可能是20个点中的5-6个点)的给定点集合中画出一条完美的直线吗?请注意,这不是直线拟合问题,但应在大多数给定点之间绘制完美的直线(水平、垂直或稍微倾斜)

以下是MATLAB代码:

e=[16116219319515540106102125155189192186188185186147148180183];
f=[138 92 92 115 258 124 218 114 125 232 431 252 539 463 643 571 582 726 726 676];
图形散射(f,e,5,'红色');

轴ij一个简单但不是很有效的解决方案是计算每个两点之间的斜率,如果一组点位于一条直线上,这些点集的所有对都将具有相同的斜率。因此,一种算法可以选择所有具有相同斜率的点,如果它们有一个共同点,则将它们连接起来。最后,您必须选择最大的集合。该算法的时间复杂度为O(N^2 logn),其中N是点数。
正如我在你的图中看到的,没有一条真正完美的线穿过所有的点,而是有一个公差,在这个算法中可以定义为连接两对的标准。假设两个斜率相差不到2%,我们将两个斜率对连接起来。

因为你想让直线穿过大多数点,所以听起来很像直线拟合问题,尽管你说不是。你有没有看过泰尔森估值器(),它是一种线性回归,忽略了高达30%的异常值

如果你只是想要一条通过极值的线,你可以这样做:

% Setup data
e = [161    162   193   195   155    40   106   102   125   155   189   192   186   188   185   186   147   148   180   183];
f = [138    92    92   115   258   124   218   114   125   232   431   252   539   463   643   571   582   726   726   676];
% Create scatterplot
figure(1);
scatter(f, e, 5, 'red');
axis ij;

% Fit extrema
[min_e, min_idx_e] = min(e);
[max_e, max_idx_e] = max(e);
[min_f, min_idx_f] = min(f);
[max_f, max_idx_f] = max(f);
% Determine largest range and draw line accordingly
if (max_e-min_e)>(max_f-min_f)
    line(f([min_idx_e, max_idx_e]), e([min_idx_e, max_idx_e]), 'color', 'blue')
    text(f(max_idx_e), e(max_idx_e), ' Extrema')
else
    line(f([min_idx_f, max_idx_f]), e([min_idx_f, max_idx_f]), 'color', 'blue')
    text(f(max_idx_f), e(max_idx_f), ' Extrema')
end

% Fit using Theil-Sen estimator
[m, e0] = Theil_Sen_Regress(f', e');
line([min_f, max_f], m*[min_f, max_f]+e0, 'color', 'black')
text(max_f, m*max_f+e0, ' Theil-Sen')
但是,您会注意到,这两种解决方案都不会自动拟合点,这仅仅是因为存在太多的异常值,除非您事先过滤这些异常值。因此,您最好使用Shai和McMa提出的RANSAC算法。

这是一个教科书上的例子。因为Matlab实际上有一些非常好的直线拟合示例。

注意:由于您处理的是有限精度,除非您声明一些公差,否则通过任何直线的点最多不超过2个。您看过RANSAC或Hough变换吗?这不是拟合问题有什么原因吗?你说你想让这条线穿过大部分的点。对我来说,听起来像是一个拟合问题…?@Adrey,小公差(-1到1)能解决吗?@Shai,Hough变换在这种情况下有用吗?这与我在回答中提到的Theil-Sen估值器非常接近,它决定了最佳拟合线的斜率和y相交。看起来Theil-Sen估值器可以工作。但无法获取此数据的结果。我再查一遍。极端代码不是解决方案。请注意,泰尔森估计器位于链接后面,它只接受列向量作为输入,因此在您的情况下,您必须使用
[m,e0]=Theil\u Sen\u回归(f',e')
@kkuilla I将代码扩展为包含泰尔森回归,并添加了一个数字!非常感谢你的回答。极值对我来说非常有效。你能提供更多的解释这个方法或一些细节链接。还有一件事,是不是可以识别一个额外的线(第二行)通过使用极值?对我来说很好。。。无论如何,还有很多其他类似的工具箱,甚至维基百科文章中的实现:无法调查RANSAC,因为Extrema为我工作。