输入:C矩阵2xN(2D点)
输出:C矩阵2xM(2D点),点数相等或更少。
假设我们有C矩阵2xN包含几个2D点,它看起来像这样:
我们想要的是将“close”点分组到一个点,用其他点的平均值来衡量。
例如,在第二个图像中,每组蓝色圆圈将是一个点,点坐标将是关闭蓝色圆圈中所有点的平均点。
也可以说“close”,我的意思是:他们彼此的距离将小于DELTA
(已知的标量)。所以想要的输出是:
关于算法的运行时间,我没有上限请求,但我多次调用该方法...
我尝试了什么:
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。 谢谢
答案 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