减少关闭点

时间:2014-01-25 12:14:33

标签: algorithm matlab

  

输入:C矩阵2xN(2D点)

     

输出:C矩阵2xM(2D点),点数相等或更少。

假设我们有C矩阵2xN包含几个2D点,​​它看起来像这样:

enter image description here

我们想要的是将“close”点分组到一个点,用其他点的平均值来衡量。 例如,在第二个图像中,每组蓝色圆圈将是一个点,点坐标将是关闭蓝色圆圈中所有点的平均点。 也可以说“close”,我的意思是:他们彼此的距离将小于DELTA(已知的标量)。所以想要的输出是:

enter image description here

关于算法的运行时间,我没有上限请求,但我多次调用该方法...
我尝试了什么:

function C = ReduceClosePoints(C ,l_boundry)
    x_size = abs(l_boundry(1,1)-l_boundry(1,2)); %220
    DELTA = x_size/10;
    T = [];

    for i=1:size(C,2)
        sum = C(:,i);
        n=1;
        for j=1:size(C,2)
            if i~=j     %not in same point
                D = DistancePointToPoint(C(:,i),C(:,j));
                if D < DELTA
                    sum = sum + C(:,j);
                    n=n+1;
                end
            end
        end
        sum = sum./n; %new point -> save in T matrix
        T = [T sum];
    end
    C = T;
end

我正在使用Matlab。 谢谢

2 个答案:

答案 0 :(得分:1)

从输出中删除重复项的最简单方法是在最后一步,替换:

C = T;

使用:

C = unique(T', 'rows')';

请注意,矩阵上下文中的unique()仅按行方式工作,因此我们必须进行两次转置。

答案 1 :(得分:0)

我忘记删除之前测试的分数。
如果该代码对使用该代码的人有用:

function C = ReduceClosePoints(C ,l_boundry)
     x_size = abs(boundry(1,1)-boundry(1,2)); %220 / 190
     DELTA = x_size/10;
     i=1;
     while i~=size(C,2)+1
         sum = C(:,i);
         n=1;
         j=i;
         while j~=size(C,2)+1
             if i~=j     %not same point
                 D = DistancePointToPoint(C(:,i),C(:,j));
                 if D < DELTA
                     sum = sum + C(:,j);
                     n=n+1;
                     C(:,j) = [];
                     j=j-1;
                 end
             end
             j=j+1;
         end
         C(:,i) = sum./n; %change to new point
         i=i+1;
     end
end