如何计算没有循环的矩阵的欧氏长度?

时间:2011-03-17 16:56:29

标签: matlab distance norm euclidean-distance vectorization

似乎答案应该很简单,但我很难过。我有一个Nx3矩阵矩阵,其中第1和第3列是第n项的X Y和Z坐标。我想计算从原点到物品的距离。在非矢量化形式中,这很容易。

距离= norm([x y z]);

距离= sqrt(x ^ 2 + y ^ 2 + z ^ 2);

然而,在矢量化形式中它并非如此简单。当你将矩阵传递给规范时,它不再返回欧几里德长度。

距离=标准(矩阵); %不起作用

距离= sqrt(x(:,1)。* x(:,1)+ y(:,2)。* y(:,2)+ z(:,3)。* z(:,3 )); %只是看起来很乱

有更好的方法吗?

5 个答案:

答案 0 :(得分:14)

试试这个:

>> xyz = [1 2 3; 4 5 6; 7 8 9; 2 8 4]

xyz =

     1     2     3
     4     5     6
     7     8     9
     2     8     4

>> distance = sqrt(sum(xyz.^2, 2))

distance =

          3.74165738677394
          8.77496438739212
          13.9283882771841
          9.16515138991168

答案 1 :(得分:3)

是的,有。

distance = sqrt(sum(matrix.^2,2)); %# matrix is [x y z]

答案 2 :(得分:1)

获得矩阵向量的范数

vecnorm( A, p, dim)

已在MATLAB 2017b中引入。 对于给定的问题,欧几里得距离(L2范数)设置为p = 2,行操作设置为dim = 2。

vecnorm( X, 2, 2)

答案 3 :(得分:0)

我认为要走的路是distance = sqrt(matrix(:,1).^2+matrix(:,2).^2+matrix(:,3).^2)

Matlab中的循环太慢了。矢量操作总是首选(我相信你知道)。此外,使用.^2(逐元素平方)不必查看矩阵的每一列两次,因此速度会更快。

答案 4 :(得分:0)

使用h2O

goodFeaturesToTrack