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