Как избежать множественных вычислений в обратном вызове `map`? - PullRequest
0 голосов
/ 26 декабря 2018

Я написал следующий «однострочный» для нормализации вектора (представленного здесь обычным массивом), что означает деление каждой записи на евклидову норму вектора.

normalize = v => v.map(x => x/Math.sqrt(v.map(x => x * x).reduce((a, b) => a + b)))

К сожалению, это не очень эффективно, так как норма вычисляется снова и снова для каждой записи.Можем ли мы изменить этот «однострочник» таким образом, чтобы избежать повторной оценки?

РЕДАКТИРОВАТЬ: Один метод, который я нашел - не очень элегантный и не очень читаемый - требует добавления другого входного аргумента к внешнемулямбда и использование ее в качестве входных данных для нормы:

 normalize = w => (norm => w.map(x => x / norm))(Math.sqrt(w.map(x => x * x).reduce((a, b) => a + b)))

1 Ответ

0 голосов
/ 26 декабря 2018

Просто не старайтесь быть слишком умным ...

const normalize = v => {
    const norm = Math.sqrt(v.map(x => x * x).reduce((a, b) => a + b)));
    return v.map(x => x / norm);
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...