Matlab 关于二维数据点的几个问题

Matlab 关于二维数据点的几个问题,matlab,Matlab,过去我在SO寻求帮助方面取得了一些成功,并从你们那里获得了很多好的提示和建议。我遇到了三个问题,我真的很想得到帮助。 首先,这是我用作输入的散点图的图片: 以下是我用来生成精确绘图的代码(减去手动箭头/线): 我想知道是否有人能帮我回答我的三个问题: 鉴于上述各点,我如何通过编程绘制手动输入的线条?我尝试了LS方法,它产生了ok(ish)结果,我不确定是否会得到“更紧”的直线 有时,我的数据中存在离群值,这些离群值与行/列方式的其他数据不完全一致。是否有办法消除这些异常值(如中所示) 最后,

过去我在SO寻求帮助方面取得了一些成功,并从你们那里获得了很多好的提示和建议。我遇到了三个问题,我真的很想得到帮助。 首先,这是我用作输入的散点图的图片:

以下是我用来生成精确绘图的代码(减去手动箭头/线):

我想知道是否有人能帮我回答我的三个问题:

  • 鉴于上述各点,我如何通过编程绘制手动输入的线条?我尝试了LS方法,它产生了ok(ish)结果,我不确定是否会得到“更紧”的直线
  • 有时,我的数据中存在离群值,这些离群值与行/列方式的其他数据不完全一致。是否有办法消除这些异常值(如中所示)
  • 最后,如果点不是按特定顺序排列的,有没有办法计算每个“矩形”的“中心”?可以按特定顺序排列这些点以提供帮助吗?还是有更聪明的方法
  • 谢谢你花时间看我的问题。我真的希望有人能帮我-我一直在绞尽脑汁想如何做这些事情,但我想不出解决办法


    编辑:删除了指向我的LS方法的链接,因为它在水平方向上是不正确的。

    好的,所以我花了一点时间尝试在这里帮忙。我想我至少可以让你开始按程序画线,希望它能让你对解决其他两个问题有所了解

    我几乎复制了你的代码,并从那里开始。我在这里粘贴的是在您声明cx和cy矩阵后添加/调整的内容

    现在来解释我的思维过程和逻辑
    Cy
    被设计为
    cx
    Cy
    的“压缩”矩阵,但沿Y坐标值排序
    Cx
    是相同的,只是沿X坐标排序。我希望这方面的逻辑应该相当直截了当。如果不是这样的话,我会解释的

    现在是
    diffY
    diffX
    。我取了每个坐标的差(分别是Xs和Ys),因为我们知道这里有一个模式,它使XY对形成一个网格状的形状。我基本上依赖于这样一个事实,即每行点(水平和垂直)的Y(或X)值存在相当大的差异。一旦我在相邻点之间有了这个差异,我就会寻找大于2的差异(这是在看到差异之后的事后分析)。-1用于给我行的实际结尾,而不是下一行的开始,因为我们将从列表中的项(1,:)开始(如果您查看代码中的行,则更有意义)

    (这当然是一个巨大的假设,对于这个特定的数据集来说,这是一个特殊的假设。虽然它可能适用于大多数类似网格的形状,但这必须经过测试。)

    还有一张便条。我确实注意到,后来在我使用差异收集的点列表中,我的思维过程开始崩溃。您可以按照我在代码中的模式继续绘制更多的线,以了解我的意思

    至于你的另外两个问题。你可能会接受我在这里的想法并加以改进/扩展。我认为,您应该能够通过查看给定行中的所有点(idx[1]->idx[2])并确保它们符合直线,从而找到异常值。本质上要求它们满足直线方程的一般公式,可以通过使用用于绘制直线的点获得该公式。当然,您必须对此有一点容错能力

    然后,对于矩形,您可以使用有序的点组来创建矩形,并可能使用
    regionprops
    函数来计算由您可以收集的数据点指定的矩形的质心(二维世界中的中心)

    祝你好运

    Cy = zeros(length(cy),2);
    [Cy(:,2), IX] = sort(cy);
    Cy(:,1) = cx(IX)';
    
    diffY = [0; diff(Cy(:,2))]
    idx = find(diffY>2)-1
    Cy(idx,:) % Last mark in given row, appears to be slight issue further along.
    
    Cx = zeros(length(cx),2);
    [Cx(:,1), IX] = sort(cx);
    Cx(:,2) = cy(IX)';
    
    diffX = [0; diff(Cx(:,1))]
    idx2 = find(diffX>2)-1
    Cx(idx2,:) % Last mark in given row, appears to be slightly off later on. (top of grid though)
    
    
    
    %%
    figure('Position',[0,0,c,r]);
    scatter(Cy(:,1),Cy(:,2),'.');
    axis([0 c 0 r])
    set(gca,'YDir','reverse')
    % Horizontal lines
    line([Cy(1,1) Cy(idx(1),1)], [Cy(1,2) Cy(idx(1),2)], 'Color', 'red', 'LineWidth', 2)
    line([Cy(idx(1)+1,1) Cy(idx(2),1)], [Cy(idx(1)+1,2) Cy(idx(2),2)], 'Color', 'red', 'LineWidth', 2)
    line([Cy(idx(2)+1,1) Cy(idx(3),1)], [Cy(idx(2)+1,2) Cy(idx(3),2)], 'Color', 'red', 'LineWidth', 2)
    
    % Vertical lines
    line([Cx(1,1) Cx(idx2(1),1)], [Cx(1,2) Cx(idx2(1),2)], 'Color', 'red', 'LineWidth', 2)
    line([Cx(idx2(1)+1,1) Cx(idx2(2),1)], [Cx(idx2(1)+1,2) Cx(idx2(2),2)], 'Color', 'red', 'LineWidth', 2)