2016-08-16 8 views
1

У меня есть следующий:Как манипулировать сложение и умножение матрицы для вычисления евклидовых расстояний?

A = [1 2 3; 4 5 6; 7 8 9]; 
B = [10 11 12; 13 14 15]; 

[N1, D1] = size(A); 
[N2, D2] = size(B); 

A_sq = sum(A.^2, 2); 
B_sq = sum(B.^2, 2)'; 
D = A_sq(:,ones(1,N2)) + B_sq(ones(1,N1),:) - 2.*(A*B'); 

где D является N1 х D1 матрицы.

Я хочу написать выражение для D в одном шаге, то есть, что-то вроде этого (это для иллюстрации, но она должна вычислить же евклидово расстояние, как приведенный выше код):

D = sum(A - B).^2; 

I оценят любые рекомендации.

+3

Этот код несколько трудно поддаётся - на каком эвклидовом расстоянии вы пытаетесь вычислить? –

+0

В k-значении кластеризации вычисляется расстояние между точками данных и центроидами. A имеет больше строк, чем B, но обе имеют одинаковый размер. –

+0

ОК, так что расстояние между каждым вектором в A и каждым вектором в B? –

ответ

0

Если у вас есть Statistics Toolbox вы можете использовать pdist2, который делает только что:

D = pdist2(A,B).^2 

Или вы можете сделать это вручную с bsxfun и permute:

D = permute((sum(bsxfun(@minus, A, permute(B, [3 2 1])).^2,2)), [1 3 2]); 

Для примера матриц

A = [1 2 3; 4 5 6; 7 8 9]; 
B = [10 11 12; 13 14 15]; 

любой из приведенных выше г ives

D = 
    243 432 
    108 243 
    27 108 

 Смежные вопросы

  • Нет связанных вопросов^_^