我的数据集有四列[X Y Z C]。我想找到以[X,Y,Z]为中心的给定球体中具有半径r的所有C值。解决这个问题的最佳方法是什么?我应该使用clusterdata命令吗?
答案 0 :(得分:2)
这是一个使用天真欧几里德距离的解决方案:
说V = [X Y Z C]
是您的数据集,Center = [x,y,z]
是球体的中心,然后
dist = bsxfun(@minus,V(:,1:3),Center); % // finds the distance vectors
% // between the points and the center
dist = sum(dist.^2,2); % // evaluate the squares of the euclidean distances (scalars)
idx = (dist < r^2); % // Find the indexes of the matching points
好的C
值
good = V(idx,4); % // here I kept just the C column
答案 1 :(得分:0)
这不是“群集分析”:您不会尝试在数据中发现结构。
相反,您正在做的事情通常称为“范围查询”或“半径查询”。在经典数据库术语中,SELECT
,带有距离选择器。
您可能希望使用欧氏距离定义球体。出于计算目的,通过简单地取半径的平方来代替平方 Euclidean实际上是有益的。
我不使用matlab,但必须有大量的例子来说明如何从查询点计算数据集中每个实例的距离,然后选择距离足够小的那些对象。
我不知道Matlab是否有任何好的索引结构包。但总的来说,在3D中,这可以通过索引结构很好地加速。计算所有距离为O(n)
,但索引结构仅为O(log n)
。