Свести кривую массива чисел - PullRequest
0 голосов
/ 02 июня 2018

Я пытаюсь найти метод нормализации (не уверен, что это правильное слово) диапазона чисел.

Скажем, у меня есть массив:

[0, 1, 2, 3, 4, 70, 80, 900]

Я хочу выровнять или усреднить кривую диапазона, так что это больше похоже на:

[10, 11, 12, 13,14, 50, 100, 300].// не настоящий расчет

Таким образом, увеличение меньших чисел по сравнению с уменьшением больших чисел.

Как называется эта техника?Нормализованная шкала?Я хотел бы реализовать это в некотором Javascript.

ОБНОВЛЕНИЕ: Надеюсь, вот лучшее описание того, что я пытаюсь сделать:

У меня есть оригинальный массив чисел:

[0, 10, 15, 50, 70, 100]

При обработке через function averageOutAllNumbers(array, slider) будет получено и массив, который при установке slider на 100% будет выглядеть так:

[0, 20, 40, 60, 80, 100] // the curve has been flattened

, когда для слайдера установлено значение 0%, он вернетсяисходный массив.Если для slider установлено значение 50%, возвращаемый массив будет выглядеть так: что-то как:

[0, 12, 19, 52, 88, 100] // the curve is less steep [do not take these number literally, I'm guess what the output would be based on the slider].

array.max() всегда будет 100.

1 Ответ

0 голосов
/ 10 июня 2018

Спасибо за комментарии, они указали мне ближе к решению.Нет, спасибо троллям, которые проголосовали;если вы не можете это исправить, никто не может - верно!

Когда я обновил свой вопрос, я понял, что "увеличение меньших чисел по сравнению с уменьшением больших чисел" в конечном итоге приведет кравномерно распределенный набор чисел, например [20, 20, 20, 20, 20].Однако я действительно хотел что-то вроде того, что я сказал в вопросе: [0, 20, 40, 60, 80, 100] // the curve has been flattened.Я сделал еще несколько поисков таких вещей, как:

  • Равномерно пробелить массив нечетных чисел
  • Составление списка равномерно расположенных чисел в определенном диапазоне
  • Возвратравномерно распределенные числа в указанном интервале
  • Найти процент X между двумя числами

Из списка результатов поиска я нашел ответ на свой оригинальный вопрос: "Чтоэта техника называется? " Линейная интерполяция

На основании этого мне удалось создать следующее:

var orig = [3, 11, 54, 72, 100];

function lerp(n, x0, x1) {
    // returns a position: x that is n percent between y0 and y1
    // As numbers in array are x only, y values are fixed to 0(start) - 1(end)
    const y0 = 0;
    const y1 = 1;
    const x = ((y1 - n)*x0 + (n - y0)*x1) / (y1 - y0);

    return x;
}

var flattenedEven = orig.map((value, index, arr) => {
    return lerp(1, value, (Math.max(...arr)/arr.length) * (index + 1));
});

//=> [20, 40, 60, 80, 100]

var flattenedCurve = orig.map((value, index, arr) => {
    return lerp(.7, value, (Math.max(...arr)/arr.length) * (index + 1));
});

//=> [14.9, 31.3, 58.2, 77.6, 100]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...