Как рассчитать евклидову длину матрицы без петель?

Кажется, что ответ на этот вопрос должен быть простым, но я в тупике. У меня есть матрица матрицы 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 ответа

Решение

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

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

>> расстояние = sqrt(сумма (xyz.^2, 2))

расстояние =

          +3,74165738677394
          +8,77496438739212
          +13,9283882771841
          +9,16515138991168

Да, есть.

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

Чтобы получить нормы векторов матрицы

vecnorm( A, p, dim)

был представлен в MATLAB 2017b. Для данного вопроса евклидово расстояние (норма L2), установите p = 2, и построчные операции, установите dim = 2.

vecnorm( X, 2, 2)

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

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

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

h2o.init()
df1<-as.h2o(matrix1)
df2<-as.h2o(matrix2)
distance<-h2o.distance(df1,df2,"l2")
#l2 for euclidean distance
Другие вопросы по тегам