Comment dois-je normaliser un vecteur dans Matlab où la somme est 1?
J'ai besoin de normaliser un vecteur de N entiers, de sorte que:
- Chaque valeur est proportionnelle à sa valeur d'origine (la valeur doit être comprise entre 0 et 1)
- La somme de toutes les valeurs =1
Par exemple:
Si j'ai un vecteur
V = [2,2,1,0]
le vecteur normalisé devrait devrait ê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 de "0" --> résultante de la matrice ne change pas
- un seul élément de la matrice est >0 et tous les autres éléments sont = 0 --> résultante tableau: l'élément >0 est 1 et les autres 0
mais si j'ai une autre affaire,bien que le résultat est proportionnel à la somme n'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 suis pas sûr si le nombre sont corrects parce que je ne peux pas utiliser Matlab pour l'instant, mais je suis sûr que la somme est > 1 )
Ahy soupçon?
Je vous remercie à l'avance
source d'informationauteur dragonmnl
Vous devez vous connecter pour publier un commentaire.
Cela dépend. Qu'est-ce que votre norme fonction?
norm(x)
dans MATLAB renvoie la norme, ce qui signifie la somme des carrés des éléments d'un vecteur normaliséx
est 1.Dans votre exemple:
sum(v_norm .^ 2)
en effet, les rendements 1, maissum(v_norm)
n'est pas, comme prévu.Qu'entendez-vous par "normaliser"? Est-ce à dire en divisant par la valeur qui est valable mathématique norme a pour fonction, selon le norme de définition?
Qu'entendez-vous par "proportionnelle"? Cela signifie que tous les éléments sont multipliés par même nombre? Si elle le fait, et c'est valable mathématique norme, vous ne pouvez pas garantir que la somme des éléments qui le sera toujours 1.
Par exemple, considérons
v = [1, -2]
. Puissum(v) = -1
.Ou peut-être
sum
est la fonction que vous cherchez, mais il n'est pas mathématiquement se qualifier en tant que norme, parce que une norme est une fonction qui assigne une fonction strictement positive, la longueur ou la taille de tous les vecteurs dans un espace vectoriel.Dans l'exemple ci-dessus,
sum(v)
est négatif.Vous pouvez choisir soit:
sum(x)
qui répond à ces deux exigences, mais ne sont pas admissibles en tant que norme de la fonction, car il peut donner des valeurs négatives.norm(x, 1)
comme OleThomsenBuus suggéré, ce qui en fait calculesum(abs(x(:)))
.Il ne sera pas répondre à la fois à vos exigences, à moins que vous limitez votre espace vectoriel de non-négatif vecteurs.
Ce que vous devez faire est, je crois, de normaliser l'utilisation de la 1-norme (taxi norme):
Variable
v_normed
devrait maintenant être[0.4, 0.4, 0.2, 0.0]
. Le 1-norme dev_normed
sera égal à 1. Vous pouvez également calculer la somme du vecteur (similaire à la 1-norme, mais sans appliquer de l'absolu de la fonction de chaque valeur), mais l'amplitude de cette somme sera entre -1 et 1 dans le cas général (si toutes les valeurs dev
sont en dessous de 0). Vous pouvez utiliserabs
sur la somme, mais mathématiquement, il ne sera plus admissible en tant que norme.Si il n'y a pas plus de conditions pour votre normalisation que vous avez donné au début de votre question, une solution possible serait