使用matlab获取距离r的点x的所有邻域

时间:2014-11-21 21:43:46

标签: matlab nearest-neighbor

我有一个n维点,并希望得到距离r的所有邻域。

我知道matlab有rangesearch()来获取候选集中距离r的邻域,但在我的问题中我没有候选集。

是否有任何matlab代码可以完成这项工作?

谢谢!

我的意思是我想创建这个球内的点子集。例如,我有一个点(3,1),半径r是5,所以我想找到r中5到点(3,1)的所有点。在这种情况下,增量值为1,这意味着可能的答案可能是点(4,1),(3,2),(5,1)......我是否清楚自己?

1 个答案:

答案 0 :(得分:1)

您可以使用ndgrid创建候选集。在二维示例中,您需要一个间距为1的点网格。

xrange = -10:10;
yrange = -10:10;
[X, Y] = ndgrid(xrange, yrange);

这产生两个点的二维矩阵。要使其符合rangesearch所期望的格式:

candidate_set = [X(:), Y(:)];

然后你可以致电rangesearch来查找哪些是在所选点的半径范围内:

test_pt = [3, 1];
radius = 5;
idx = rangesearch( candidate_set, test_pt, radius );

返回一个单元格数组(每个测试点一个元素)。在您的情况下,您只有一个测试点,因此我们只对idx{1}感兴趣:

neighborhood = candidate_set(idx{1}, :);

还有一点需要注意:我们可能会更聪明地生成候选集。我们知道邻域将以围绕测试点的超立方体为界,因此我们可以首先使用超立方体中的点作为候选集:

range_min = test_pt - radius;
range_max = test_pt + radius;

然后我们可以从这个范围构建候选集:

xrange = ceil(range_min(1)):floor(range_max(1));
yrange = ceil(range_min(2)):floor(range_max(2));
[X, Y] = ndgrid(xrange, yrange);
candidate_set = [X(:), Y(:)];

在任意数量的维度中:

nDims = length(test_pt);
grid_vecs = cell(nDims, 1);
grid_mats = cell(nDims, 1);
for ii = 1:nDims
    grid_vecs{ii} = ceil(range_min(ii)):floor(range_max(ii));
end
[grid_mats{:}] = ndgrid(grid_vecs{:});
for ii = 1:nDims
    grid_mats{ii} = grid_mats{ii}(:);
end
candidate_set = horzcat( grid_mats{:} );