2014-11-21 46 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

相關問題