这听起来像是个反问,但我在这里提出问题有两个原因:

  • 我花了一段时间才弄清楚C++ std::norm()与MATLAB/Octave有何不同,因此其他人可能会在这里偶然发现。
  • 我发现将norm()函数定义为与通常被认为是范数(或L2-范数或欧几里得范数等)的东西有所不同(尽管紧密相关)是奇怪的。

    具体来说,C++标准库将复数的norm()定义为模数(或绝对值)的平方,当复数为a + i * b形式时,模数为sqrt(a ^ 2 + b ^ 2) 。

    这违背了我对范数的理解,该范数在指定为欧几里得范数(对应于此处使用的模数)时,是平方和的平方根。我将引用Mathworld's definition of the complex modulus

    这是别人遇到的吗?我发现它是由于将某些信号处理代码从Octave移植到C++而导致的,而我发现引用此差异的唯一其他地方是在GCC邮件列表中。

    最佳答案

    C++对“范数”一词的用法相当困惑,因为大多数人只在 vector 空间的背景下才遇到范数。如果您将复数视为实数上的 vector 空间,那么这绝对不是标准。为了公平起见,对C++而言,std::norm()函数的确从复数到实数计算了所谓的Field Norm

    幸运的是,有std::abs()函数可以完成您想要的操作。

    关于c++ - 为什么C++将范数定义为欧几里德范数平方?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1348692/

  • 10-11 19:11