我有一个n维点,并希望得到距离r的所有邻域。
我知道matlab有rangesearch()来获取候选集中距离r的邻域,但在我的问题中我没有候选集。
是否有任何matlab代码可以完成这项工作?
谢谢!
我的意思是我想创建这个球内的点子集。例如,我有一个点(3,1),半径r是5,所以我想找到r中5到点(3,1)的所有点。在这种情况下,增量值为1,这意味着可能的答案可能是点(4,1),(3,2),(5,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{:} );