2011-03-17 71 views
5

看来这个答案应该很简单,但我很难过。我有一个N×3矩阵的矩阵,其中第一个第二和第三列是第n个项目的X Y和Z坐标。我想计算从原点到项目的距离。在非矢量化的形式中,这很容易。如何计算无循环矩阵的欧几里得长度?

distance = norm([x y z]);

距离= SQRT(X^2 + Y^2 + Z^2);

但是,在向量化的形式它并不那么简单。当你传递一个矩阵来规范它不再返回欧几里德长度。

distance = norm(matrix); %不起作用

距离= SQRT(X(:,1)* X(:,1)+ Y(:,2)* Y(:,2)+ Z( :,3)* Z(:,3)); %只是似乎凌乱

有没有更好的方法来做到这一点?

回答

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 
+0

非常优雅,真的! =) – Phonon 2011-03-17 17:05:21

3

是的,有。

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

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

Matlab中的循环太慢了。矢量操作始终是首选(我相信你知道)。另外,使用.^2(逐元素平方)不需要两次查看矩阵的每一列,所以这会更快。

0

使用H2O

h2o.init() 
df1<-as.h2o(matrix1) 
df2<-as.h2o(matrix2) 
distance<-h2o.distance(df1,df2,"l2") 
#l2 for euclidean distance