2013-01-15 16 views
5

Mam dwie macierze, A (wymiary M x N) i B (N x P). W rzeczywistości są to kolekcje wektorów - wektorów wierszowych w A, wektorów kolumnowych w B. Chcę uzyskać wyniki podobieństwa kosinusów dla każdej pary a i b, gdzie a jest wektorem (wiersz) z macierzy A, a b jest wektorem (kolumna) z macierzy B.Jak obliczyć podobieństwo kosinusa za pomocą dwóch macierzy

Zacząłem od pomnożenia macierzy, co skutkuje macierzą C (wymiary M x P).

C = A * B

Jednakże, aby uzyskać wyniki podobieństwa cosinus, to należy podzielić każdą wartość C(i,j) przez normę dwóch odpowiednich wektorów. Czy mógłbyś zaproponować najprostszy sposób zrobienia tego w Matlabie?

+0

jak o http://octave.sourceforge.net/statistics/function/pdist.html? – Nemo

Odpowiedz

5

Najprostszym rozwiązaniem jest obliczenie normy najpierw za pomocą elementu mnożenie i sumowanie wzdłuż pożądanych wymiarach

normA = sqrt(sum(A .^ 2, 2)); 
normB = sqrt(sum(B .^ 2, 1)); 

normA i normB obecnie kolumna i rząd wektora wektor, odpowiednio. Aby podzielić odpowiednie elementy w A * B przez normA i normB użyć bsxfun tak:

C = bsxfun(@rdivide, bsxfun(@rdivide, A * B, normA), normB); 
+0

Wielkie dzięki, ale myślę, że należy użyć pierwiastka kwadratowego z norm. –

+0

@JohnManak Ah tak, zapomniałem o tym. Naprawiony. –

Powiązane problemy