17 Stimmen

Warum definiert C++ die Norm als die euklidische Norm zum Quadrat?

Diese Frage mag etwas rhetorisch klingen, aber ich stelle sie hier aus zwei Gründen:

  1. Ich habe eine Weile gebraucht, um herauszufinden, was C++ std::norm() anders macht als MATLAB / Oktave , damit andere hier darüber stolpern.
  2. Ich finde es merkwürdig, den Begriff norm() Funktion als etwas anderes (wenn auch eng verwandt) als das, was allgemein als Norm (oder L2-Norm, oder euklidische Norm, usw., usw.) angesehen wird

Speziell die C++-Standardbibliothek definiert norm() für komplexe Zahlen das Quadrat des Moduls (oder des absoluten Werts) ist, wobei der Modul sqrt(a^2 + b^2) ist, wenn die komplexe Zahl die Form a + i*b hat.

Dies widerspricht meinem Verständnis der Norm, die, wenn sie als euklidische Norm angegeben wird (was dem hier verwendeten Modul entspricht), die Quadratwurzel der Summe der Quadrate ist. Ich referenziere Mathworld's Definition des komplexen Moduls .

Ist das auch bei anderen der Fall? Ich habe es bei der Portierung von Signalverarbeitungscode von Octave nach C++ entdeckt, und der einzige andere Ort, an dem ich Hinweise auf diesen Unterschied gefunden habe, war die GCC-Mailingliste.

14voto

Stephen Canon Punkte 100340

Die Verwendung des Wortes "Norm" in C++ ist ziemlich verwirrend, da die meisten Menschen Normen nur im Zusammenhang mit Vektorräumen kennen. Wenn man die komplexen Zahlen als Vektorraum über den reellen Zahlen betrachtet, ist dies definitiv keine Norm. Fairerweise muss man sagen, dass die Funktion std::norm( ) in C++ die sogenannte Feld Norm von den komplexen Zahlen zu den reellen Zahlen.

Zum Glück gibt es die Funktion std::abs( ), die genau das tut, was Sie wollen.

6voto

Kevin Reid Punkte 27569

Übrigens kann die euklidische Norm zum Quadrat als Optimierung nützlich sein, insbesondere in der Spielphysik; wenn Sie vergleichen Größenordnungen/Entfernungen, oder aus anderen Gründen nicht benötigen Linearität dann können Sie mit den quadrierten Abständen statt mit den tatsächlichen Abständen arbeiten und die Berechnung von Quadratwurzeln vermeiden.

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

(unter Verwendung der Tatsache, dass abs() eine Größe ist, wie in einer anderen Antwort erwähnt)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X