Почему C ++ определяет норму как евклидову норму в квадрате - PullRequest
15 голосов
/ 28 августа 2009

Это может звучать как риторический вопрос, но я задаю его здесь по двум причинам:

  1. Мне потребовалось некоторое время, чтобы понять, что C ++ std :: norm () делает не так, как Matlab / Octave, поэтому другие могут наткнуться на это здесь.
  2. Мне кажется странным определять функцию norm() как нечто иное (хотя и тесно связанное) с тем, что обычно считается нормой (или нормой L2, или евклидовой нормой и т. Д. И т. П.)

В частности, стандартная библиотека C ++ определяет norm() для комплексных чисел, которые должны быть квадратом модуля (или абсолютного значения), где модуль равен sqrt (a ^ 2 + b ^ 2), когда комплексное число находится в форме a + i * b.

Это идет вразрез с моим пониманием нормы, которая, будучи указана как евклидова норма (которая соответствует используемому здесь модулю), является квадратным корнем из суммы квадратов. Я буду ссылаться на определение Mathworld комплексного модуля .

Это то, с чем столкнулись другие? Я обнаружил это в результате переноса некоторого кода обработки сигналов из Octave на C ++, и единственное место, где я нашел ссылку на это различие, было в списке рассылки GCC (невозможно опубликовать ссылку из-за ограничения в 1 ссылку).

Ответы [ 2 ]

13 голосов
/ 28 августа 2009

Использование C ++ слова «норма» довольно запутанно, поскольку большинство людей когда-либо сталкивались с нормами только в контексте векторных пространств. Если вы рассматриваете комплексные числа как векторное пространство над реалами, это определенно не норма. В интересах C ++, функция std :: norm () вычисляет так называемую Field Norm от комплексных чисел до вещественных чисел.

К счастью, есть функция std :: abs (), которая делает то, что вы хотите.

5 голосов
/ 08 августа 2010

Кстати, евклидова норма в квадрате может быть полезна в качестве оптимизации, особенно в игровой физике; если вы хотите сравнить величины / расстояния или по любой другой причине не нуждаетесь в линейности , то вы можете работать с квадратами расстояний, а не с фактическими расстояниями, и избегать вычисления площади корни.

norm(v1) < norm(v2)         instead of   abs(v1) < abs(v2)
norm(v) < CONSTANT_SQUARED  instead of   abs(v) < CONSTANT

(используя тот факт, что abs () - это величина, указанная в другом ответе)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...