2014-11-21 174 views
-1

我有一个n维点,并且想要获得距离r的所有邻域。使用matlab获得距离r的点x的所有邻域

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

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

谢谢!

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

+0

该社区是围绕点为中心半径为r的球。 'rangesearch'返回这个球内给定点的子集。所以如果你没有一个候选人,你的意思是“获得所有的邻居”? – KQS 2014-11-22 00:16:49

+0

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

回答

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{:}); 
+0

非常感谢!这正是我想要的! – user1964417 2014-11-27 04:36:58