这听起来像是个反问,但我在这里提出问题有两个原因:
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/