Как рассчитать евклидову длину матрицы без петель? - PullRequest
6 голосов
/ 17 марта 2011

Кажется, что ответ на этот вопрос должен быть простым, но я в тупике. У меня есть матрица матрицы Nx3, где 1-й, 2-й и 3-й столбцы - это координаты X Y и Z n-го элемента. Я хочу рассчитать расстояние от начала координат до предмета. В не векторизованном виде это легко.

расстояние = норма ([x y z]);

или

расстояние = sqrt (x ^ 2 + y ^ 2 + z ^ 2);

Однако в векторизованном виде все не так просто. Когда вы передаете матрицу в норму, она больше не возвращает евклидову длину.

расстояние = норма (матрица); % не работает

и

расстояние = sqrt (x (:, 1). * X (:, 1) + y (:, 2). * Y (:, 2) + z (:, 3). * Z (:, 3 )); % кажется грязным

Есть ли лучший способ сделать это?

Ответы [ 4 ]

14 голосов
/ 17 марта 2011

Попробуйте это:

>> 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 голосов
/ 17 марта 2011

Да, есть.

distance = sqrt(sum(matrix.^2,2)); %# matrix is [x y z]
0 голосов
/ 20 августа 2017

Использование h2O

h2o.init()
df1<-as.h2o(matrix1)
df2<-as.h2o(matrix2)
distance<-h2o.distance(df1,df2,"l2")
#l2 for euclidean distance
0 голосов
/ 17 марта 2011

Я думаю, что путь distance = sqrt(matrix(:,1).^2+matrix(:,2).^2+matrix(:,3).^2).

Циклы в Matlab слишком медленные. Векторные операции всегда предпочтительнее (как я уверен, вы знаете). Кроме того, при использовании .^2 (поэлементное возведение в квадрат) нет необходимости просматривать каждый столбец матрицы дважды, поэтому это будет еще быстрее.

...