这可能听起来像是一个修辞问题,但我在这里提出这个问题有两个原因:
norm()函数定义为与通常被认为是标准(或L2范数,或欧几里德范数等等)不同(虽然密切相关)的函数很奇怪.具体而言,C++标准库将norm()复数定义为模数(或绝对值)的平方,其中当复数为a + i*b时,模数为sqrt(a ^ 2 + b ^ 2).
这违背了我对规范的理解,当规范为欧几里德范数(对应于这里使用的模数)时,是平方和的平方根.我将参考Mathworld对复模数的定义.
这是其他人遇到的事吗?我发现它是将一些信号处理代码从Octave移植到C++的结果,而我发现引用这个差异的唯一其他地方是在GCC邮件列表上(由于1-link限制而无法发布链接).
Ste*_*non 13
"规范"这个词的C++用法相当令人困惑,因为大多数人只是在向量空间的上下文中遇到过规范.如果您将复数视为实数上的向量空间,这绝对不是常态.为了公平对待C++,std :: norm()函数确实计算了从复数到实数的所谓Field Norm.
幸运的是,有std :: abs()函数,它可以满足您的需求.
顺便提一下,欧几里德范数平方可以用作优化,特别是在游戏物理中; 如果你想比较幅度/距离,或者由于任何其他原因不需要线性,那么你可以使用平方距离而不是实际距离,并避免计算平方根.
norm(v1) < norm(v2) instead of abs(v1) < abs(v2)
norm(v) < CONSTANT_SQUARED instead of abs(v) < CONSTANT
Run Code Online (Sandbox Code Playgroud)
(使用abs()是另一个答案中提到的幅度这一事实)