有效地将复合物转化为极性形式

时间:2016-12-21 11:35:04

标签: c++ complex-numbers polar-coordinates

std::complex c转换为极坐标形式很容易:

magnitude = abs(c)
phase = arg(c)

然而,这是两个单独的操作来获得幅度和相位。如果标准库提供了将std::complex转换为极坐标形式的单一方法,则可能在算法或实现方面进行优化。

标准库是否提供了将笛卡尔复合体转换为极坐标形式的更有效方法?我只找到了相反的polar方法。

2 个答案:

答案 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 + expabs + arg更快(使用优化)。

答案 1 :(得分:0)

据我所知,标准库不提供以极坐标形式保存复数的对象。如果您需要此功能,则必须自己实现此类,或者找到第三方库。