web-dev-qa-db-fra.com

Fonction pour normaliser n'importe quel nombre de - 1

J'essaie de créer une fonction qui prend un nombre et le normalise de 0 à 1 entre ses limites minimale et maximale. Par exemple: 

Si je veux normaliser une valeur de 10 entre 5 et 15, j’appelle ceci:

val = 10; normalize(val, 5, 15); Retourne 0.5

normaliser une valeur 0 entre -10 et 5

val = 0; normalize(val, -10, 5); Retourne 0.666

Voici la fonction que j'ai créée:

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 la suivante: est-ce la méthode la plus efficace pour normaliser une valeur à 1 dimension? J'appellerai cette fonction plusieurs milliers de fois par image à 60 images par seconde. J'aimerais donc qu'elle soit optimisée au maximum pour réduire la charge de calcul. J'ai cherché des formules de normalisation, mais je ne trouve que des solutions bidimensionnelles ou tridimensionnelles.

8
Marquizzo

Utiliser la réponse de Nathan Bertons avec une fonction préconfigurée pour certaines valeurs ayant les mêmes valeurs min et max, vous pouvez l'utiliser.

function normalize(min, max) {
    var delta = max - min;
    return function (val) {
        return (val - min) / delta;
    };
}

console.log([5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15].map(normalize(5, 15)));

7
Nina Scholz

Avec la réponse de Nathan Bertons , vous devez valider si max-min est égal à 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 generalization pour restreindre la plage de valeurs de l'ensemble de données entre des points arbitraires a et b en utilisant:

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)); }

1
Pedro Diniz

Je vais compléter la réponse de Nina Scholz, vous pouvez utiliser la bibliothèque de soulignement pour trouver le minimum et le maximum pour un tableau et vous pouvez utiliser comme suit, ou créer la vôtre (méthodes simples avec une simple boucle):

si vous utilisez nodeJS, vous devez installer le underscore avec la commande npm installer le underscore et l’utiliser avec la commande var _ = require('underscore/underscore');.__ ou vous pouvez importer la bibliothèque au format HTML et l’utiliser sur votre site Web.



    function min(arr) {
        if (!arr.length) return null;
        var minValue = arr[0];
        for (var item of arr) {
            if (item  maxValue) maxValue = item;
        }
        return maxValue;
    }

    var array = [1, 2, 3, 4, 5, 6, 7, 8, 9];

    function normalize(min, max) {
        var delta = max - min;
        return function (val) {
            return (val - min) / delta;
        };
    }

    function normalizeArray(array) {
        var minValue = min(array); //if you use underscore _.min(array)
        var maxValue = max(array);//if you use underscore _.max(array)
        return array.map(normalize(minValue, maxValue));
    }
    console.log(normalizeArray(array));

0
Naim Sulejmani