在matlab中计算矩阵中每个点的最近邻居

时间:2015-05-14 11:41:36

标签: matlab nearest-neighbor

我的矩阵包含x,y,z值。这组点构造一个3d对象,我试图计算每个点的最近邻居数。我想在每个点周围定义一个特定的半径,并计算该范围内的点数(和距离)。

我已经完成了像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

1 个答案:

答案 0 :(得分: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
相关问题