2009-08-28 8 views
14

Questo può sembrare un po 'una domanda retorica, ma lo chiedo qui per due motivi:Perché C++ definisce la norma come la norma euclidea quadrato

  1. Mi c'è voluto un po' per capire cosa C++ std :: norm() stava facendo diversamente da Matlab/Octave, quindi altri potrebbero inciampare qui.
  2. Trovo strano per definire la funzione di norm() come qualcosa di diverso (anche se strettamente correlata) a quello che è generalmente considerato essere la norma (o norma L2, o norma euclidea, ecc ecc)

In particolare la libreria standard C++ definisce norm() per i numeri complessi come il quadrato del modulo (o valore assoluto), dove il modulo è sqrt (a^2 + b^2) quando il numero complesso è nella forma a + i * b.

Questo va contro la mia comprensione della norma, che quando specificata come norma euclidea (che corrisponde al modulo usato qui), è la radice quadrata della somma dei quadrati. Mi riferirò allo Mathworld's definition of the complex modulus.

È qualcosa che altri hanno incontrato? L'ho trovato come risultato del porting di un codice di elaborazione del segnale da Octave a C++ e l'unico altro posto in cui ho trovato riferimento a questa differenza era nella mailing list GCC (non è possibile pubblicare il collegamento a causa del limite di 1-link).

+3

Discussione sulla mailing list GCC qui: http://gcc.gnu.org/ml/gcc/2001-08 /msg01129.html – runexe

risposta

12

L'uso di C++ della parola "norma" è piuttosto confuso, poiché la maggior parte delle persone ha sempre incontrato norme nel contesto di spazi vettoriali. Se si visualizzano i numeri complessi come uno spazio vettoriale sui reali, questa non è sicuramente una norma. In tutta onestà al C++, la funzione std :: norm() calcola il cosiddetto numero Field Norm dai numeri complessi ai numeri reali.

Fortunatamente, c'è la funzione std :: abs(), che fa ciò che vuoi.

+0

Ah, non ero a conoscenza del campo normativo - che ha certamente un senso o almeno fornisce una spiegazione plausibile del perché hanno scelto di definire norm() in questo modo. – runexe

+0

Probabilmente era solo una coincidenza. –

+1

Ricordo Mathworld affermando che l'uso della "norma" quando si parla di complessi o di numeri complessi è ambiguo. La norma sul campo ha alcuni vantaggi, come indicato da Kevin Reid in basso, e anche il fatto che è chiuso nel campo numerico - la norma C++ di un "intero complesso" è un numero intero, quindi è possibile ottimizzare con l'intero- solo ops. –

5

Per inciso, la norma Euclidea quadrata può essere utile come ottimizzazione, specialmente nella fisica del gioco; se si desidera confrontare dimensioni/distanze, o per qualsiasi altra ragione non è necessario linearità, quindi è possibile lavorare con le distanze al quadrato piuttosto che le distanze effettive ed evitare di calcolare le radici quadrate.

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

(sfruttando il fatto che abs() è grandezza come detto in un'altra risposta)

Problemi correlati