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

时间:2015-01-05 08:20:57

标签: matlab line

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

这是MATLAB代码:



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];

figure;scatter(f, e, 5, 'red');

axis ij;




这里是图片: enter image description here

3 个答案:

答案 0 :(得分:4)

由于您希望线条通过大多数点,即使您说它不是线条拟合问题,它听起来也很像。您是否看过Theil-Sen估算器(for example this one on fex),这是一个线性回归,忽略了大约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算法。 Line Fit Example

答案 1 :(得分:3)

这是RANSAC algorithm的教科书示例。 Matlab的This free toolbox实际上有一些非常好的线拟合示例。

答案 2 :(得分:2)

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