To powinno być łatwe.Skaluj listę liczb od -1.0 do 1.0
Mam listę numerów. Jak skalować wartości listy między -1.0
i 1.0
w celu uzyskania min = -1
i max = 1.0
?
To powinno być łatwe.Skaluj listę liczb od -1.0 do 1.0
Mam listę numerów. Jak skalować wartości listy między -1.0
i 1.0
w celu uzyskania min = -1
i max = 1.0
?
znaleźć min i max
następnie dla każdej skali numer x
do 2 * (x - min)/(max - min) - 1
prostu sprawdzić -
Jeśli jest to długa lista precomputing c = 2/(max - min)
i skalowanie z c * x - 1
jest dobrym pomysłem.
Po drugie, uwaga na temat przetwarzania wstępnego, o ile to możliwe. Twój kompilator może nie być na tyle inteligentny, aby automatycznie wykonać tę optymalizację, jeśli użyjesz powyższego formularza (prawdopodobnie nie będzie próbował przełączyć "2" i licznika, aby zgrupować stałe razem). – bta
Wystarczy, że zanotuję przykład (używając danych użytych w mojej odpowiedzi dla porównania), wierzę, że lista [-5, -3, -1, 0, 2, 4] zostanie odwzorowana na [-1, -0.55555, -0,11111, 0,11111, 0,55555, 1]. To ilustruje, co mam na myśli, gdy pytam, czy chcemy, aby 0 było nadal równe 0 w wynikach. –
@Alex Tak, ale dlaczego miałbyś oczekiwać 0, aby odwzorować na 0? – deinst
To jest podpisana normalizacja
1 - uzyskać minimalne i maksymalne wartości na liście (MINVAL, MAXVAL)
2 - Konwersja każdy numer używając tego wyrażenia signedNormal = (((originalNumber - Minimum)/(maksymalna - minimalna)) * 2.0) - 1,0
ja celowo to nieefektywne, aby być jasne - bardziej efektywne byłoby
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
Nie ma sensu w zakres każdym razem przeliczania sensu zakres podziału, mult jest szybsza
Jeśli chcesz 0 do nadal równe 0 w efekcie końcowym:
Np
[ -5, -3, -1, 0, 2, 4]
Numer z największych wielkości wynosi -5. Możemy to uzyskać równe -1 przez pomnożenie przez 0,2 (-1/-5). (Uważaj na dzielenie przez 0s, jeśli twoje liczby są zerowe.)
Pomnożyć wszystkie elementy przez 0,2.Dałoby to:
[-1, -0.6, -0.2, 0, 0.4, 0.8]
Chociaż uwaga że
[ -5, -5, -5 ] -> [ -1, -1, -1 ]
i
[ 5, 5, 5 ] -> [ 1, 1, 1 ]
i
[ 0, 0, 0 ] -> [ 0, 0, 0 ]
które mogą lub nie mogą być, co chcesz. Dzięki @Hammerite za podpowiadanie mnie tym z jego bardzo pomocnym komentarzem :)
To zależy. Czy chcesz, aby 0 pozostało równe 0 w ostatecznym wyniku? –
@Alex: To może nie być możliwe, jeśli 0 nie znajduje się w zakresie. – relet
Co chcesz zrobić w zdegenerowanym przypadku, w którym wszystkie liczby są takie same? – Hammerite