Matlab计算点到原点(0,0)的距离 除循环外还有什么实现方法?
多点点到原点距离的Matlab优化实现
你当前用循环调用pdist的实现逻辑是对的,但运行效率很低,尤其处理大量点的时候性能会很差,下面给出3种更优的向量化实现方案:
- 方案1:直接用欧氏距离公式实现(无额外工具箱依赖,性能最优)
直接对坐标做逐元素运算,不需要循环也不需要调用距离函数,代码如下:
clc; clear all; x1 = 1:11; y1 = [1;1;11;16;19;3;14;5;16;10;22]; % 直接向量化计算所有点到原点的欧氏距离 distResult = sqrt(x1(:).^2 + y1(:).^2);
这里的x1(:)是将数组统一转为列向量,避免行列不匹配的运算报错,运算后得到的distResult是和点数量等长的列向量,每个元素对应一个点到原点的距离。
- 方案2:单次调用
pdist实现(不需要循环)
如果需要保留用pdist的写法,不需要逐点构造矩阵循环调用,把所有点和原点合并为一个矩阵单次计算即可:
clc; clear all; x1 = 1:11; y1 = [1;1;11;16;19;3;14;5;16;10;22]; % 拼接所有目标点+原点为统一坐标矩阵 points_mat = [x1(:), y1(:); 0, 0]; % 单次调用pdist计算所有两两距离,提取每个点到原点的距离 all_dist = pdist(points_mat, 'euclidean'); distResult = all_dist(end - length(x1) + 1: end);
- 方案3:用
pdist2直接计算两组点的距离(需要统计和机器学习工具箱,写法最简洁)pdist2支持直接计算两组点之间的两两距离,一行即可得到结果:
clc; clear all; x1 = 1:11; y1 = [1;1;11;16;19;3;14;5;16;10;22]; distResult = pdist2([x1(:), y1(:)], [0, 0], 'euclidean');
三种方案都完全避免了循环,相比你当前的实现,在点数量超过1万的时候,性能可以提升数十倍以上。
内容的提问来源于stack exchange,提问作者hsi100
相关产品推荐
相关产品推荐

