【问题标题】:Fast way to compute pairwise distances and the nearest neighbours in Matlab?在Matlab中计算成对距离和最近邻居的快速方法?
【发布时间】:2012-03-18 13:38:42
【问题描述】:

我有一个 n×d 矩阵 A,代表 n 个 d 维点。我还有一个 m×d 矩阵 B,代表 m 个 d 维点。

  1. 我想知道如何有效地计算 m × n 矩阵,其 (i,j) element表示第i行之间的欧几里得距离 矩阵A和矩阵B的第j行?
  2. 如何有效地确定包含 m 个元素的向量,其第 k 个元素 element表示A的最靠近B的第k行的行?

注意我知道如何使用循环来完成上述两个操作。但是在Matlab中,使用循环效率不高,所以我问了这些问题。

谢谢!

【问题讨论】:

标签: matlab


【解决方案1】:

如果你有足够的内存,一个有效的方法可能是

[idxA,idxB] = ndgrid(1:n,1:m);

distMat = zeros(n,m);

distMat(:) = sqrt( sum((A(idxA,:) - B(idxB,:)).^2,2) );

您绝对应该分析这两个解决方案,因为循环可能已经充分优化,ndgrid 解决方案更慢。

要查找 A 中最靠近 B 中的点的行,您可以使用min。请注意,这只会为每个点提供一个最小距离;如果你需要识别关系,你必须使用find

[minDist,closestRowsInA] = min(distMat,[],1); 

【讨论】:

  • 谢谢! +1。这确实需要很多内存。我的情况是 n=m=2000,d=6。我的笔记本电脑冻结了一段时间。
  • @Ethan:我也需要购买一台新笔记本电脑。 8GB 的​​ RAM 很快就被填满了 :)
  • 您是否有一些替代方法可以平衡时间和内存的权衡?
  • @Ethan:原则上,您可以对 idxA 中的行数进行循环,例如 100 步,然后以块的形式填充 distMat。但是,我不知道这会提高多少速度。
  • 您应该运行可能的解决方案并比较速度。很久以前我问了一个愚蠢的问题,我们中的许多人惊讶地发现最快的方法(对于矩阵大小的子集)有一个循环。 mathworks.com/matlabcentral/newsreader/view_thread/249428
猜你喜欢
  • 2015-01-07
  • 1970-01-01
  • 2018-12-20
  • 2019-06-05
  • 2015-03-21
  • 2019-06-30
  • 2011-12-26
  • 2019-05-26
  • 2011-11-12
相关资源
最近更新 更多