Масштабировать список чисел от -1.0 до 1.0

Это должно быть легко.

У меня есть список чисел. Как масштабировать значения списка между -1.0 и 1.0 для min = -1 и max = 1.0?

Ответ 1

Найдите min и max

то для каждого шкалы чисел x до 2 * (x - min)/( max - min) - 1

Просто, чтобы проверить -

  • min масштабируется до -1
  • и максимальные масштабы до 1

Если это длинный список precomputing c = 2/(max - min), а масштабирование с помощью c * x - 1 - хорошая идея.

Ответ 2

Это стандартная нормализация

1 - получить минимальное и максимальное значение в списке (MinVal, MaxVal)

2 - преобразовать каждое число, используя эти выражения     signedNormal = (((originalNumber - 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

Нет смысла в пересчете диапазона каждый раз Нет точки в диапазоне деления, много быстрее

Ответ 3

Если вы хотите, чтобы 0 оставалось равным 0 в конечном результате:

  • Найдите число с наибольшей величиной. Это будет либо отображаться в 1, либо -1.
  • Разработайте то, что вам нужно, чтобы умножить его на 1 или -1.
  • Умножьте все числа в коллекции на этот коэффициент.

например

[ -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 за то, что он предложил мне этот очень полезный комментарий:)