Это должно быть легко.
У меня есть список чисел. Как масштабировать значения списка между -1,0
и 1,0
, чтобы min = -1
и max = 1,0
?
Это нормализация со знаком
1 - получить минимальное и максимальное значение в списке (MinVal, MaxVal)
2 - преобразовать каждое число, используя эти выражения signedNormal = (((originalNumber - Minimum) / (Maximum - Minimum)) * 2.0) - 1.0
Я намеренно сделал это неэффективным для ясности - более эффективным было бы
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
Нет смысла каждый раз пересчитывать диапазон Нет смысла делить диапазон, мульт быстрее
Если вы хотите, чтобы 0 по-прежнему равнялся 0 в конечном результате:
Например,
[ -5, -3, -1, 0, 2, 4]
Число с наибольшей звездной величиной -5. Мы можем получить это значение равное -1, умножив на 0,2 (-1 / -5). (Остерегайтесь деления на 0, если все ваши числа равны 0.)
Итак, умножьте все элементы на 0,2. Это даст:
[-1, -0.6, -0.2, 0, 0.4, 0.8]
Хотя обратите внимание, что
[ -5, -5, -5 ] -> [ -1, -1, -1 ]
,
[ 5, 5, 5 ] -> [ 1, 1, 1 ]
и
[ 0, 0, 0 ] -> [ 0, 0, 0 ]
Это может быть, а может и не быть тем, что вы хотите. Спасибо @Hammerite за то, что подсказал мне это своим очень полезным комментарием :)
Найдите минимальное и максимальное значение
, затем для каждой числовой шкалы от x
до 2 * (x - min) / (max - min) - 1
Просто для проверки -
Если это длинный список с предварительным вычислением c = 2 / (max - min)
и масштабирование с c * x - 1
- хорошая идея.