查看: 1509|回复: 11|关注: 0

[已解决] 一组点与一组点之间的距离快速算法

[复制链接]

入门

81 麦片

财富积分


50500


122

主题

306

帖子

0

最佳答案
  • 关注者: 4
本帖最后由 gisjun 于 2019-1-12 15:13 编辑

平面上,A组点(尺寸为N行2列,N是点个数,2是指x y坐标)到一个点之间的距离,可以把前者放入矩阵,直接用矩阵运算得到每个点与后者的距离矩阵(尺寸应该为N行1列);————————————————————————
问题:现在A组点与B组点(尺寸为M行2列)的话,如何快速得到A组点每一个点与B组每个点之间的距离矩阵?(尺寸应该为N行M列),希望不用循环,太慢了~~

论坛优秀回答者

5

主题

1232

帖子

324

最佳答案
  • 关注者: 108
发表于 2019-1-12 15:57:47 | 显示全部楼层
用meshgrid建立矩阵操作
  1. clear; clc; close all;
  2. na = 1e+3; nb = 1.2e+3;
  3. Adata = rand(na,2);
  4. Bdata = rand(nb,2);
  5. %% method 01
  6. tic;
  7. D = zeros( size(Bdata,1), size(Adata,1) );
  8. for jj = 1:1:size(Adata,1)
  9.     for ii = 1:1:size(Bdata,1)
  10.         D(ii,jj) = norm(Adata(jj,:)-Bdata(ii,:));
  11.     end
  12. end
  13. toc;
  14. %% method 02
  15. tic;
  16. [MX1, MX2] = meshgrid( Adata(:,1), Bdata(:,1) );
  17. [MY1, MY2] = meshgrid( Adata(:,2), Bdata(:,2) );
  18. dd = sqrt( (MX1-MX2).^2 + (MY1-MY2).^2 );
  19. toc;
复制代码

法一是循环,大约耗时2秒;法二是矩阵计算,耗时不超过0.05秒。

论坛优秀回答者

权威

3520 麦片

财富积分



2

主题

3728

帖子

789

最佳答案
  • 关注者: 165
发表于 2019-1-12 16:09:34 | 显示全部楼层 |此回复为最佳答案
help  pdist2

入门

81 麦片

财富积分


50500


122

主题

306

帖子

0

最佳答案
  • 关注者: 4
 楼主| 发表于 2019-1-12 18:45:48 | 显示全部楼层
本帖最后由 gisjun 于 2019-1-12 18:47 编辑

大神您好,查看了函数帮助,但是没太看懂,比如下面一个小例子:
X = randn(100,1);
Y = randn(25,1);
D = pdist2(X,Y,'euclidean');
X是一列数,Y是另一列数,返回的D是哪些点与点之间的距离呢?
上述X和Y是所有点的X Y坐标吗?,X Y长度不一样哈。二楼回复思路似乎清晰一点

论坛优秀回答者

权威

3520 麦片

财富积分



2

主题

3728

帖子

789

最佳答案
  • 关注者: 165
发表于 2019-1-12 18:59:35 | 显示全部楼层
gisjun 发表于 2019-1-12 18:45
大神您好,查看了函数帮助,但是没太看懂,比如下面一个小例子:
X = randn(100,1);
Y = randn(25,1);

返回的矩阵:100×25
第一行就是X的第一个点到Y的距离
其他类推。

入门

81 麦片

财富积分


50500


122

主题

306

帖子

0

最佳答案
  • 关注者: 4
 楼主| 发表于 2019-1-12 19:07:34 | 显示全部楼层
本帖最后由 gisjun 于 2019-1-12 19:09 编辑
maple1314168 发表于 2019-1-12 18:59
返回的矩阵:100×25
第一行就是X的第一个点到Y的距离
其他类推。

但是X只是一列数据,只有x坐标哈;y坐标不是Y吧,因为X和Y两个矩阵长度不一样

入门

81 麦片

财富积分


50500


122

主题

306

帖子

0

最佳答案
  • 关注者: 4
 楼主| 发表于 2019-1-12 19:08:54 | 显示全部楼层
TouAkira 发表于 2019-1-12 15:57
用meshgrid建立矩阵操作

法一是循环,大约耗时2秒;法二是矩阵计算,耗时不超过0.05秒。 ...

大神您好,感谢回复!
这个例子中N和M如果太大(比如几万到几十万个)。电脑会提示内存不足,能否分块处理?或者其它好点方法?

论坛优秀回答者

权威

3520 麦片

财富积分



2

主题

3728

帖子

789

最佳答案
  • 关注者: 165
发表于 2019-1-12 19:09:03 | 显示全部楼层
本帖最后由 maple1314168 于 2019-1-12 19:11 编辑
gisjun 发表于 2019-1-12 19:07
但是X只是一列数据,只有x坐标哈

X轴就没有距离?
我们初中学的单数轴啊!
距离就是差的绝对值。
接上面,如果太大的话,你单纯按X分组就可以。
输出之后,清空再下一组。

入门

81 麦片

财富积分


50500


122

主题

306

帖子

0

最佳答案
  • 关注者: 4
 楼主| 发表于 2019-1-12 19:11:23 | 显示全部楼层
maple1314168 发表于 2019-1-12 19:09
X轴就没有距离?
我们初中学的单数轴啊!
距离就是差的绝对值。

有点蒙圈啊:'(那我如何把我最开始例子中的A和B两个大矩阵放进pdist2函数里呢?其中A是第一组点的坐标矩阵,B是第二组点的坐标矩阵,均是两列,很多行

论坛优秀回答者

权威

3520 麦片

财富积分



2

主题

3728

帖子

789

最佳答案
  • 关注者: 165
发表于 2019-1-12 19:17:29 | 显示全部楼层
gisjun 发表于 2019-1-12 19:11
有点蒙圈啊那我如何把我最开始例子中的A和B两个大矩阵放进pdist2函数里呢?其中A是第一组点的坐标矩阵 ...

你看看例子啊。没有什么要求。
A,B两个两列矩阵,放进去啊。
就是说,你内存不够,可以试试单精度
或者分组,分组的话需要写到文件之后,清空,再算再保存。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐上一条 /3 下一条

快速回复 返回顶部 返回列表