2009-08-28 33 views
14

Esto puede sonar como un poco de una pregunta retórica, pero lo pregunto aquí por dos razones:¿Por qué C++ definen en la norma como la norma euclídea al cuadrado

  1. Me tomó un tiempo para averiguar lo que C++ std :: norm() estaba haciendo algo diferente de Matlab/Octave, por lo que otros pueden tropezar con esto aquí.
  2. Me parece extraño para definir la función norm() como algo diferente (aunque estrechamente relacionado) a lo que se considera generalmente que es la norma (o L2-norma, o norma euclidiana, etc, etc)

Específicamente, la biblioteca estándar de C++ define norm() para que los números complejos sean el cuadrado del módulo (o valor absoluto), donde el módulo es sqrt (a^2 + b^2) cuando el número complejo tiene la forma a + i * segundo.

Esto va en contra de mi comprensión de la norma, que cuando se especifica como la norma euclidiana (que corresponde al módulo utilizado aquí), es la raíz cuadrada de la suma de cuadrados. Voy a hacer referencia al Mathworld's definition of the complex modulus.

¿Es esto algo que otros han encontrado? Lo encontré como resultado de transferir algún código de procesamiento de señales de Octave a C++, y el único otro lugar donde encontré referencia a esta diferencia estaba en la lista de correo de GCC (no se puede publicar el enlace debido al límite de 1 enlace).

+3

Discusión sobre la lista de correo GCC aquí: http://gcc.gnu.org/ml/gcc/2001-08 /msg01129.html – runexe

Respuesta

12

El uso en C++ de la palabra "norma" es bastante confuso, ya que la mayoría de las personas solo han encontrado normas en el contexto de espacios vectoriales. Si ve los números complejos como un espacio vectorial sobre los reales, definitivamente no es una norma. Para ser justos con C++, la función std :: norm() calcula el llamado Field Norm desde los números complejos hasta los reales.

Afortunadamente, existe la función std :: abs(), que hace lo que quiere.

+0

Ah, no tenía conocimiento de la norma de campo, eso ciertamente tiene sentido, o al menos proporciona una explicación plausible de por qué eligieron definir norma() de esta manera. – runexe

+0

Probablemente fue solo una coincidencia. –

+1

Recuerdo a Mathworld afirmando que el uso de "norma" cuando se habla de complejos o números complejos es ambiguo. La norma de campo tiene algunas ventajas, como lo señala Kevin Reid a continuación, y también el hecho de que está cerrada en el campo numérico: la norma C++ de un "complejo entero" es un número entero, por lo que es posible optimizar con números enteros. solo ops. –

5

Por cierto, la norma euclidiana al cuadrado puede ser útil como una optimización, especialmente en física de juegos; si quiere compare magnitudes/distancias, o por cualquier otra razón no necesita linealidad, entonces puede trabajar con las distancias cuadradas en lugar de las distancias reales, y evitar el cálculo de las raíces cuadradas.

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

(usando el hecho de que abs() es la magnitud como se ha mencionado en otra respuesta)

Cuestiones relacionadas