2015-05-14 167 views
0

我有包含x,y,z值的矩陣。這組點構成了一個3d對象,我試圖計算每個點的最近鄰點的數量。我想定義每個點周圍的特定半徑並計算該範圍內的點數(以及距離)。在matlab中爲矩陣中的每個點計算最近鄰居

我已經經歷了諸如rangesearch和k最近鄰居搜索的命令。但在這種情況下,兩個矩陣進行比較(也在knnsearch中,我們必須指定k,這在我的情況下我不知道)。我不明白如何在我的情況下實現。

我嘗試下面的代碼:

[idx,d] = knnsearch(data, data, 'k', 2); 
idx = idx(:,2); 
d = d(:,2); 

但在這裏我必須承擔的k值,我沒有我的情況下知道的。

在我來說,我要算最近的鄰居的數量每個點和輸出將是一個名單,我應該得到這樣的輸出:

point no. of nearest neighbour 
    1    6 
    2    5 
    3    6 
    . 
    . 
    . 
    and so on 

此外,我想標記每個點保存每個點的相應最近鄰距離,以便我可以檢查距離/沒有。未來最近鄰居的變化。

任何人都可以請解釋/幫助我如何做到這一點?我是matlab中的新手。

我的數據的一部分下面給出:

264.67 255.79 11.00 
282.44 273.18 11.00 
236.23 253.87 11.50 
245.33 212.00 11.50 
253.16 275.29 11.50 
253.70 237.27 11.50 
269.70 223.38 11.50 
208.67 237.63 12.00 
230.90 229.11 12.00 
232.00 276.48 12.00 
239.50 295.82 12.00 
264.92 295.61 12.00 
287.01 214.26 12.00 
291.15 294.58 12.00 
297.43 239.49 12.00 
249.33 315.10 12.50 
261.50 198.64 12.50 
305.01 266.10 12.50 
191.10 257.55 13.00 
212.98 292.16 13.00 
218.21 210.05 13.00 
222.06 313.80 13.00 
233.73 187.74 13.00 
234.78 333.66 13.00 
273.08 318.80 13.00 
280.13 186.76 13.00 
295.73 319.43 13.00 
312.86 298.54 13.00 
185.38 233.91 13.50 
190.37 283.66 13.50 
255.75 172.10 13.50 
309.92 209.49 13.50 
194.43 210.13 14.00 
197.52 313.08 14.00 
207.03 183.46 14.00 
213.29 338.50 14.00 
258.27 338.71 14.00 
226.50 352.15 14.50 
228.77 164.23 14.50 
246.56 355.50 14.50 
280.69 344.59 14.50 
282.57 161.51 14.50 
305.99 179.03 14.50 
317.13 325.47 14.50 
327.37 276.40 14.50 
169.91 275.45 15.00 
170.32 251.96 15.00 
172.89 300.59 15.00 
193.76 306.33 15.00 
200.78 320.18 15.00 
302.32 347.91 15.00 
330.88 304.43 15.00 
333.36 221.93 15.00 
170.31 214.56 15.50 
179.42 187.53 15.50 
194.62 342.52 15.50 
199.50 164.02 15.50 
224.58 141.00 15.50 
253.10 148.18 15.50 
266.79 366.55 15.50 
345.62 262.82 15.50 
157.07 237.54 16.00 
176.35 326.62 16.00 
208.93 359.79 16.00 
250.60 379.57 16.00 
280.64 137.73 16.00 
288.39 369.18 16.00 
335.45 185.37 16.00 
346.99 289.53 16.00 
351.74 236.84 16.00 
149.43 298.42 16.50 
149.92 267.37 16.50 
157.61 318.26 16.50 
173.19 167.57 16.50 
227.41 372.79 16.50 
313.94 154.15 16.50 
321.60 351.65 16.50 
337.87 334.95 16.50 
353.03 212.88 16.50 
138.70 245.43 17.00 
154.27 193.70 17.00 
195.59 141.63 17.00 
211.92 381.47 17.00 
252.66 119.68 17.00 
270.67 391.90 17.00 
308.53 376.21 17.00 
352.97 318.91 17.00 
365.34 279.69 17.00 
220.97 120.85 17.50 
228.72 392.90 17.50 
368.50 253.00 17.50 
125.11 259.33 18.00 
142.81 305.02 18.00 
249.78 400.68 18.00 
290.91 393.36 18.00 
301.88 129.57 18.00 
324.68 376.33 18.00 
367.80 303.15 18.00 
369.98 227.46 18.00 
133.66 285.79 18.50 
137.59 330.22 18.50 
145.98 172.84 18.50 
166.54 146.06 18.50 
213.65 405.56 18.50 
278.67 110.00 18.50 
342.04 361.08 18.50 
349.65 164.12 18.50 
356.92 344.87 18.50 
365.68 197.21 18.50 
123.00 314.81 19.00 
131.22 196.47 19.00 
189.56 123.10 19.00 
231.15 414.71 19.00 
240.80 99.53 19.00 
265.62 412.91 19.00 
307.02 405.95 19.00 
323.39 395.94 19.00 
332.83 137.33 19.00 
372.33 328.28 19.00 
384.16 277.40 19.00 
111.97 272.25 19.50 
140.09 356.63 19.50 
284.62 414.37 19.50 
388.97 241.41 19.50 
199.91 413.33 20.00 
212.80 105.38 20.00 
341.38 382.31 20.00 
359.57 369.16 20.00 
387.04 309.14 20.00 
106.72 248.53 20.50 
109.89 295.83 20.50 
121.25 173.45 20.50 
122.14 345.59 20.50 
144.63 149.62 20.50 
248.01 423.81 20.50 
303.17 421.49 20.50 
373.74 353.48 20.50 
397.45 265.11 20.50 
110.68 203.56 21.00 
214.97 425.16 21.00 
262.00 86.85 21.00 
318.40 113.99 21.00 
322.14 417.45 21.00 
366.75 151.62 21.00 
379.16 180.31 21.00 
390.19 214.46 21.00 
96.34 275.69 21.50 
106.73 322.19 21.50 
162.86 123.25 21.50 
187.22 100.66 21.50 
235.91 434.62 21.50 
261.02 435.03 21.50 
282.83 435.08 21.50 
300.86 89.53 21.50 
400.23 294.67 21.50 
135.90 379.28 22.00 
180.89 419.86 22.00 
221.95 79.90 22.00 
349.98 124.43 22.00 
391.93 334.04 22.00 
196.85 430.73 22.50 
403.04 242.16 22.50 
87.19 258.89 23.00 
93.39 305.04 23.00 
104.84 347.62 23.00 
124.23 375.85 23.00 
125.92 149.03 23.00 
295.40 444.15 23.00 
314.25 432.75 23.00 
374.76 379.75 23.00 
388.92 360.67 23.00 
402.72 319.80 23.00 
215.15 443.56 23.50 
410.27 273.18 23.50 
92.96 197.72 24.00 
137.82 123.03 24.00 
162.82 99.79 24.00 
249.31 64.86 24.00 
262.57 451.93 24.00 
287.46 448.79 24.00 
334.25 99.59 24.00 
390.96 163.54 24.00 
399.49 194.10 24.00 
80.78 285.80 24.50 
87.12 324.59 24.50 
116.03 373.69 24.50 
183.34 436.42 24.50 
239.18 452.55 24.50 
285.94 72.02 24.50 
408.91 221.44 24.50 
411.32 298.95 24.50 
89.90 208.51 25.00 
93.39 186.47 25.00 
188.67 78.48 25.00 
199.13 448.36 25.00 
280.17 454.07 25.00 
374.50 135.83 25.00 
384.87 384.12 25.00 
401.41 346.36 25.00 
101.88 163.53 25.50 
+0

那你試試這麼遠嗎? –

+0

我試圖實施knnsearch,但爲此我必須提供一個查詢點和'k'數據和此點之間的最近點。我不確定這是否適合我的情況。這就是我要求提出建議的原因。如果你知道一些簡單的方法來做到這一點,請幫忙@Hwathanie – MRP

+1

你可以舉一個小數據集的例子嗎?我想嘗試一下。 – roni

回答

1

如果內存是不是一個問題,你可以計算使用bsxfun距離矩陣:

% compute the distances matrix, O(n^2) in memory 
D = sqrt(... 
    bsxfun(@minus, data(:,1)', data(:,1)).^2 + ... 
    bsxfun(@minus, data(:,2)', data(:,2)).^2 + ... 
    bsxfun(@minus, data(:,3)', data(:,3)).^2); 

% and the number of neighbours per node (within 40m in this case) 
N = sum(D < 40, 2) - 1 
+0

這應該起作用 – roni