La fonction de normaliser n'importe quel nombre de 0 - 1
Je suis en train de faire une fonction qui prend un nombre et normalise de 0 - 1 entre min et max de limites. Par exemple:
Si je veux normaliser une valeur de 10 entre 5 à 15, j'appelle cela:
val = 10; normalize(val, 5, 15);
Renvoie à 0,5
normaliser une valeur entre 0 -10 et 5
val = 0; normalize(val, -10, 5);
Retourne 0.666
C'est la fonction que je suis venu avec:
function normalize(val, min, max){
//Shift to positive to avoid issues when crossing the 0 line
if(min < 0){
max += 0 - min;
val += 0 - min;
min = 0;
}
//Shift values from 0 - max
val = val - min;
max = max - min;
return Math.max(0, Math.min(1, val / max));
}
Ma question est: Est-ce la méthode la plus efficace pour normaliser une 1-dimensions de la valeur? Je vais être l'appel de cette fonction quelques milliers de fois par trame à 60fps, donc je voudrais l'avoir optimisé que possible afin de réduire la charge de calcul. J'ai regardé pour la normalisation des formules, mais tout ce que je trouve sont à 2 ou 3 dimensions solutions.
est min et max, toujours le même pour le tableau?
Wow, vous avez raison! J'ai été préventivement le faire sans vraiment le tester. Il fonctionne sans changer de vitesse > 0
min et max serait de changer selon l'endroit où je suis en l'appelant. Parfois, il sera
-100, 0
parfois -3, 781
, etc.Il suffit donc de retirer la gestion spéciale de négatif min et vous êtes bon pour aller.
OriginalL'auteur Marquizzo | 2016-09-29
Vous devez vous connecter pour publier un commentaire.
Pourquoi ne pas simplement:
function(val, max, min) { return (val - min) /(max - min); }
return Math.max(0, Math.min(1, val-min / max-min))
Aussi longtemps que
val
est en fait entremin
etmax
le résultat sera toujours entre 0 et 1.Je sais. Le truc, c'est que
val
ne sera pas toujours entremin
etmax
, j'ai donc besoin d'un moyen de l'empêcher de revenir nombres négatifs ou quoi que ce soit au-dessus de 1N'oubliez pas de mettre des parenthèses autour de
(max-min)
.OriginalL'auteur Nathan Berton
À l'aide de Nathan Bertons's réponse, vous devez valider si max-min est égale à zéro, sinon le retour sera NaN:
function (val, max, min) {
if(max - min === 0) return 1 //or 0, it's up to you
return (val - min) /(max - min);
}
et vous pouvez utiliser un la généralisation pour limiter la plage de valeurs dans le jeu de données entre l'arbitraire des points a et b à l'aide de:
function (val, max, min) {
if(max - min === 0) return 1 //or 0, it's up to you
return a + (((val - min) * (b-a)) /(max - min));
}
max - min
sera égal à zéro si ils ont la même valeur, il n'y a pas moyen de donnermax = 5
etmin = 5
.OriginalL'auteur Pedro Diniz
Je Vais compléter la réponse de Nina Scholz, vous pouvez utiliser le trait de soulignement de la bibliothèque pour trouver le minimum et le maximum pour tableau et vous pouvez l'utiliser comme suivent, ou créer votre propre (méthodes simples avec une simple boucle):
si vous utilisez nodeJS vous devez installer le trait de soulignement avec la commande npm install trait de soulignement et de l'utiliser avec la commande
var _ = require('underscore/underscore');
ou vous pouvez importer la bibliothèque sur le code html et utiliser sur votre site web
Désolé, ici vous trouverez également la fonction max 🙂 la fonction max(arr) { if (!arr.length) return null; var maxValue = arr[0]; for (var point d'arr) { if (item > maxValue) maxValue = item; } return maxValue; }
OriginalL'auteur Naim Sulejmani