2013-05-12 4 views
4

J'ai un problème suivant - J'ai une matrice A de taille 16x22440.Normaliser les lignes de la matrice, de sorte que leur norme est égale à 1 (MATLAB)

Ce que je dois faire est de normaliser chaque ligne de cette matrice, de sorte que la norme de chacun d'eux est égal à 1 (for n=1:16 norm(A(n,:))==1)

Comment puis-je parvenir à Matlab?

Editer: Chaque ligne de cette matrice est un vecteur créé d'une image 160x140 et doit donc être considérée séparément. Les valeurs doivent être normalisées pour créer une matrice de zones propres.

+0

quoi 'norm'? L2? L1? – Shai

+0

La norme Eucleadienne est le cas. – Jacka

+0

alors ma réponse devrait vous être utile. – Shai

Répondre

3

Est-ce que votre installation de Matlab inclut le Neural Network Toolbox? Si oui, essayez normr:

nA = normr(A); 

Sinon, @Shai's solution est bon, sauf qu'il ne traitera pas infinie ou NaN entrées - il est beaucoup plus sûr de vérifier les cas de norme non définis après:

nA = bsxfun(@rdivide,A,sqrt(sum(A.^2,2))); 
nA(~isfinite(nA)) = 1; % Use 0 to match output of @Shai's solution, Matlab's norm() 

Notez que la normalisation d'une longueur nulle (tous les composants zéro) ou d'un vecteur de longueur infinie (un ou plusieurs composants +Inf ou -Inf) ou une composante NaN n'est pas vraiment bien définie. La solution ci-dessus renvoie tous ceux, tout comme la fonction normr de Matlab. Cependant, la fonction norm de Matlab présente un comportement différent. Vous pouvez spécifier un comportement différent, par exemple un avertissement ou une erreur, tous les zéros, les NaN, les composants mis à l'échelle par la longueur du vecteur, etc. Ce thread traite le problème des vecteurs de longueur nulle dans une certaine mesure: How do you normalize a zero vector?.

+0

Merci, heureux de découvrir la façon facile de le faire! – Jacka

3

En premier lieu, calculer la norme (je suppose que la norme Eucleadian ici)

n = sqrt(sum(A.^2, 2)); 
% patch to overcome rows with zero norm 
n(n == 0) = 1; 
nA = bsxfun(@rdivide, A, n); % divide by norm 
+1

Eh bien, après avoir utilisé votre code les normes pour chaque ligne sont ~ 0, au lieu de 1: 8.6903e-05; 1,3841e-04 1,6891e-04 2,0224e-04; 3.5168e-04; 4,0101e-04 5.7108e-04; 6,3513e-04; 6,6574e-04; 8,1582e-04; 8.5704e-04; 8,7563e-04; 0,0010; 0,0012; 0,0015; 0,0017; – Jacka

+1

@Jacka oublié de prendre 'sqrt' de la norme. Voyez si mon correctif fonctionne maintenant. – Shai

+2

Oui, maintenant ça marche, merci beaucoup! – Jacka

Questions connexes