将std::complex
c
转换为极坐标形式很容易:
magnitude = abs(c)
phase = arg(c)
然而,这是两个单独的操作来获得幅度和相位。如果标准库提供了将std::complex
转换为极坐标形式的单一方法,则可能在算法或实现方面进行优化。
标准库是否提供了将笛卡尔复合体转换为极坐标形式的更有效方法?我只找到了相反的polar方法。
答案 0 :(得分:2)
如果在计算这两个结果时实际可以分享任何部分工作,我会感到非常惊讶。注意,不仅使用不同的功能,而且使用甚至不同的方法来计算幅度和相位。这与计算例如正弦和余弦一起计算的情况非常不同,在这种情况下,同时获得结果并将它们分开比仅获得一个或另一个几乎没有困难。
形式 z = re ^(iφ)不会以任何对称方式处理 r 和φ,不会给出任何理由相信它的倒数应该。实际上要求 r ≥0开始是相当随意的;与角度的模糊度不同,角度模糊度定义为2π的整数倍,这不是分支选择的结果,而是简单的几何直觉。简而言之,极地形式在数学上并不十分有趣。
如果你对 s = log r 而不是 r 感到满意,故事会完全改变,因为那时 z = e < / em> ^( s +iφ)和 s +iφ = log z 。因此,“只是”概括了复数的对数就可以了,你的两个答案存储在结果的实部和虚部中。对<complex>
中的复数进行了扩展std::log
。
尝试一下基准测试。情况可能是log
+ real
+ imag
+ exp
比abs
+ arg
更快(使用优化)。
答案 1 :(得分:0)
据我所知,标准库不提供以极坐标形式保存复数的对象。如果您需要此功能,则必须自己实现此类,或者找到第三方库。