How to calculate Euclidean length of a matrix with

2019-05-02 13:55发布

It seems like the answer to this should be simple, but I am stumped. I have a matrix of Nx3 matrix where there 1st 2nd and 3rd columns are the X Y and Z coordinates of the nth item. I want to calculate the distance from the origin to the item. In a non vectorized form this is easy.

distance = norm([x y z]);

or

distance = sqrt(x^2+y^2+z^2);

However, in vectorized form its not so simple. When you pass a matrix to norm it no longer returns the Euclidean length.

distance = norm(matrix); %doesn't work

and

distance = sqrt(x(:,1).*x(:,1)+y(:,2).*y(:,2)+z(:,3).*z(:,3)); %just seems messy

Is there a better way to do this?

4条回答
等我变得足够好
2楼-- · 2019-05-02 14:09

Try this:

>> 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
查看更多
三岁会撩人
3楼-- · 2019-05-02 14:18

Using h2O

h2o.init()
df1<-as.h2o(matrix1)
df2<-as.h2o(matrix2)
distance<-h2o.distance(df1,df2,"l2")
#l2 for euclidean distance
查看更多
老娘就宠你
4楼-- · 2019-05-02 14:23

Yes, there is.

distance = sqrt(sum(matrix.^2,2)); %# matrix is [x y z]
查看更多
虎瘦雄心在
5楼-- · 2019-05-02 14:24

I think the way to go is distance = sqrt(matrix(:,1).^2+matrix(:,2).^2+matrix(:,3).^2).

Loops in Matlab are just too slow. Vector operations are always preferred (as I'm sure you know). Additionally, using .^2 (element-wise squaring) does not have to look each column of your matrix twice, so this would be even faster.

查看更多
登录 后发表回答