Cela devrait être facile. P>
J'ai une liste de chiffres. Comment puis-je échelle les valeurs de la liste, entre -1.0 code> et
1.0 code> pour
min = -1 code> et
max = 1.0 code >? p>
3 Réponses :
trouver le min et le max p>
Puis pour chaque échelle de numéro juste pour vérifier - p>
S'il s'agit d'une longue liste précalutant x code> à
2 * (x-min) / (max-min) - 1 code> p> p>
c = 2 / (max-min) code> et de mise à l'échelle avec
C * x - 1 code> est une bonne idée. p>
J'ai deuxième que la note de pré-calculable dans la mesure du possible. Votre compilateur peut ne pas être suffisamment intelligent pour rendre cette optimisation automatiquement si vous utilisez le formulaire ci-dessus (il n'essaiera probablement pas de commuer le 2 code> et le numérateur pour regrouper les constantes ensemble).
Juste pour annoter avec un exemple (en utilisant l'entrée que j'ai utilisée dans ma réponse à la comparaison), je pense que la liste [-5, -3, -1, 0, 2, 4] correspondrait à [-1, -0.55555, - 0,11111, 0.11111, 0.55555, 1]. Cela illustre ce que je veux dire quand je demande si nous voulons que 0 est toujours égal à 0 dans les résultats.
@ALEX Oui, mais pourquoi vous attendriez-vous à 0?
Je ne Attends-je i> 0 pour avoir à mapper à 0, c'est juste un cas possible - la question n'indique pas ce qui est requis. Je ne voulais pas critiquer votre réponse de quelque manière que ce soit - c'est certainement une réponse parfaitement bonne et on dirait que cela pourrait être ce qui est nécessaire. Je pensais juste que cela valait la peine de l'annoter avec un exemple concret afin qu'il soit évident de la manière dont les réponses de votre et de la marque diffèrent de la mienne. Je suppose que j'aurais pu le mettre dans ma réponse plutôt que d'encombrer les commentaires de votre question - je vais le déplacer à ma réponse si vous le souhaitez.
Une généralisation est; a = limites_max - limite_min; b = limiteary_min; C = A / (max - min); Enfin pour chaque X PASS C * (x - min) + b. Maintenant, pour l'exemple requis Définir la limite_min = -1, limite_max = 1. Pour obtenir quelque chose d'apparition à un ensemble de pourcentage cumulatif limite_min = 0, limite_max = 100.
Ceci est une normalisation signée
1 - Obtenez la valeur minimale et maximale de la liste (Minval, maxval) p>
2 - Convertissez chaque numéro en utilisant ces expressions Signednormal = (((((OriginalNumber - Minimum) / (MAXIMUM-MINIMUM)) * 2.0) - 1.0 P>
J'ai délibérément fait cette inefficace afin d'être clair - plus efficace serait P>
double min = myList.GetMinimum(); double max = myList.GetMaximum(); double signedRangeInverse = 1.0 / (max - min); for(int i = 0;i < myList.NumberOfItems();i++) myList[i] = (((myList[i] - min) * signedRangeInverse) * 2.0) - 1
Si vous voulez 0 pour toujours égal à 0 dans le résultat final:
E.G P>
[ 0, 0, 0 ] -> [ 0, 0, 0 ]
Ça dépend. Voulez-vous que 0 pour toujours égal à 0 dans le résultat final?
@ALEX: Cela ne peut même pas être possible si 0 n'est pas dans la gamme.
Que voulez-vous arriver dans le cas dégénéré où tous les chiffres sont les mêmes?
@Relet - si 0 est dans la gamme ou non, c'est-à-dire que nous disons que les échelles de nombres min et i> les échelles de numéro max à 1, ou si nous supposons que nous voulons augmenter 0, auquel cas nous n'avons besoin que du nombre avec la plus grande ampleur et l'échelle de 1 ou -1, puis à l'échelle des autres numéros à l'aide du même rapport. Je sais ce que je veux dire :)
Je vois que tu sais ce que tu veux dire. :RÉ