在Matlab中删除长行的数据点

时间:2018-08-01 18:20:02

标签: matlab scatter-plot

我有一个坐标列表coord,在绘制时看起来像这样:

this

我想从数据集中删除从0到1完全长的点的长字符串,此图所示从(0,11)开始到(1,11)结束,另一个从(0,24),结束于(1,28)。

到目前为止,我已经尝试使用kmeans使用以下代码按高度对数据进行分组:

jet = colormap('jet');

amount = 20;
step = floor(numel(jet(:,1))/amount);
idxOIarr = cell(numel(terp));
scale = 100;

for ii = 1:numel(terp)
    figure;
    hold on;
    expandDat = [stretched{ii}(:,1), scale.*log(terp{ii}(:,2))];
    [idx, cent] = kmeans(expandDat(:,1:2), amount, 'Distance', 'cityblock');
    idxOIarr{ii} = idx;
    for jj = 1:amount
        scatter(stretched{ii}(idx == jj,1), FREQ(terp{ii}(idx == jj,2)), 10, jet(step*jj,:), 'filled');
    end
end

此图产生的结果:this image尽管它确实很好地分隔了较高的行,但它将中间的行分成两部分,并将以(0,20)开始的行分组,并在其下面有一些数据点

还有其他方法可以对这些点进行分组和删除吗?

1 个答案:

答案 0 :(得分:0)

解决这个问题的最有效方法是建立一个图形,其中每个点都是一个顶点。将具有“连接”或“闭合”作用的点与边连接起来。因此,该图将连接组件。现在,您需要查找连接的组件,其范围从0到1。

  1. 构建图形。使用R树,找到邻居是最有效的。 Here are some suggestions。例如,您也可以使用k-d树。但是,这并不是绝对必要的,因为如果没有适当的空间索引结构,它可能会变得很慢,因为您必须比较每对点之间的距离。

    给定Nx2矩阵coord,您可以找到每对之间的平方距离:

    D = sum((reshape(coord,[],1,2) - reshape(coord,1,[],2)).^2,3);
    

    (再次注意,如果N很大,这将很昂贵,在这种情况下,使用R树将大大加快速度)。 D(i,j)是索引为ij(即coord(i,:)coord(j,:)的点之间的距离。

    接下来,构建图,G,节点ij已连接。 G(i,j)==1是一个对称矩阵:

    G
  2. 查找已连接的组件。连接的组件只是一组节点,您可以通过跟随边来相互访问。您实际上并不需要查找所有连接的组件,只需要查找具有G = D <= max_distance; 的点集,然后从每个点开始,递归地访问其连接的组件中的所有元素以查看是否可以到达某个点具有x=0

    下面的代码未经测试,但有帮助的是它提供了一个起点:

    x=1