2012-06-27 3 views
8

I doivent normaliser un vecteur d'entiers N de telle sorte que:Comment est-ce que je devrais normaliser un vecteur dans Matlab où la somme est 1?

  • Chaque valeur est proportionnelle à sa valeur d'origine (la valeur est comprise entre 0 et 1)
  • La somme de toutes les valeurs a = 1

Par exemple:

Si j'ai un vecteur

V = [2,2,1,0] 

le vecteur normalisé doit doit être:

V_norm = [0.4,0.4,0.2,0] % 0.4+0.4+0.2 = 1 

J'ai essayé avec de nombreuses solutions trouvées dans cette communauté et sur le web et, enfin, je l'ai fait avec ce code:

part = norm(V); 
if part > 0 
    V_norm = V/part; 
else % part = 0 --> avoid "divide by 0" 
    V_norm = part; 
end 

Le problème que cela fonctionne si :

  • tous les éléments du tableau sont "0" -> array résultant ne change pas
  • un seul élément de l'ARRA y est> 0 et tous les autres éléments sont = 0 -> réseau résultant: l'élément> 0 est égal à 1 et l'autre 0

mais si j'ai un autre cas, bien que le résultat est proportionnel à la somme est pas 0. Par exemple:

V = [1,0,1] 
    V_norm = [0.74,0,0.74] 

    V = [1,1,1] 
    V_norm = [0.54,0.54,0.54] 

(Je ne sais pas si le nombre est correct parce que je ne peux pas utiliser Matlab en ce moment mais je suis sûr que la somme est> 1)

Ahy allusion?

Nous vous remercions à l'avance

Répondre

8

... la vecteur normalisé devrait devrait être:

v_norm = [0.4, 0.4, 0.2, 0]; % 0.4+0.4+0.2 = 1

Cela dépend. Quelle est votre norm fonction?

norm(x) dans Matlab renvoie la norme standard, ce qui signifie la somme des carrés des éléments d'un vecteur normalisé x est 1.

Dans votre exemple:

v = [1, 1, 1];   %# norm(v) = sqrt(1^2+1^2+1^2) = ~1.7321 
v_norm = v/norm(v); %# v_norm = [0.5574, 0.5574, 0.5574] 

sum(v_norm .^ 2) en effet des rendements 1, mais sum(v_norm) ne fonctionne pas, comme prévu.


I doivent normaliser un vecteur d'entiers N de telle sorte que chaque valeur est proportionnelle à sa valeur d'origine (la valeur sera comprise entre 0 et 1) et la somme de toutes les valeurs est de 1.

Que voulez-vous dire par "normalisent"? Est-ce que cela signifie diviser par une valeur qui est une fonction de norme mathématique valide, selon le norm definition?

Que voulez-vous dire par "proportionnel"? Est-ce que cela implique que tous les éléments sont multipliés par numéro? Si c'est le cas, et qu'il s'agit d'une norme mathématique valide, vous ne pouvez pas garantir que la somme des éléments sera toujours égale à 1.
Par exemple, considérons v = [1, -2]. Puis sum(v) = -1.

Ou peut-être sum est la fonction que vous cherchez, mais il ne se qualifie pas mathématiquement comme une norme, car une norme est une fonction qui affecte une longueur strictement positive ou la taille à tous les vecteurs dans un espace vectoriel . Dans l'exemple ci-dessus, sum(v) est négatif.


soupçon Ahy?

Vous pouvez choisir:

  1. sum(x), qui répond à ces deux exigences, mais ne se qualifie pas en fonction de la norme, car il peut donner des valeurs négatives.
  2. norm(x, 1), comme suggéré par OleThomsenBuus, qui calcule réellement sum(abs(x(:))).
    Il ne remplira pas vos deux exigences, sauf si vous limitez votre espace vectoriel à des vecteurs non négatifs.
6

S'il n'y a pas des conditions à votre normalisation occasion de nouvelles que vous avez donné au début de votre question, une solution possible serait

V = [3 4 -2]; 
S = sum(V); 
if (S == 0) 
    % no solution 
else 
    V_norm = V ./ S; 
end 
sum(V_norm) 
+0

En tant que sidenote, 'sum (v)' ne peut pas être mathématiquement qualifié de [norme] (http://en.wikipedia.org/wiki/Norm_ (mathématique)) car il peut donner des valeurs négatives. –

+0

Ne satisfait pas à toutes les valeurs comprises entre 0 et 1 (en considérant les éléments négatifs). – Tobold

+0

Je suis d'accord. Je n'aurais pas dû utiliser la "normalisation" au lieu de la "norme", comme l'a fait le PO. Je vais modifier ma réponse en conséquence. – Deve

9

Ce que vous devez faire est, je crois, normaliser en utilisant la 1-norm (norme de taxi):

v = [2, 2, 1, 0]; 
v_normed = v/norm(v, 1); % using the 1-norm 

variable v_normed devrait maintenant être [0.4, 0.4, 0.2, 0.0]. La norme 1 de v_normed sera égale à 1. Vous pouvez également additionner le vecteur (similaire à la norme 1, mais sans appliquer la fonction absolue à chaque valeur), mais la plage de cette somme sera comprise entre -1 et 1 dans le cas général (si les valeurs dans v sont inférieures à 0). Vous pouvez utiliser abs sur la somme résultante, mais mathématiquement, il ne sera plus considéré comme une norme.

+0

+1: Bonne suggestion, mais je ne pense pas que «abs» soit nécessaire. –

+0

Mieux? Merci d'avance. –

+0

Comme je l'ai dit dans ma réponse, il ne remplit toujours pas les deux exigences de l'OP pour _all_ vecteurs, mais au moins, il se qualifie mathématiquement comme une norme. –

Questions connexes