Это легко конвертировать std::complex
c
в полярную форму:
magnitude = abs(c)
phase = arg(c)
Однако это две отдельные операции для получения величины и фазы. Оптимизация, как алгоритмическая, так и в реализации, могла бы быть возможной, если бы стандартная библиотека предоставляла единственный метод для преобразования std::complex
в своей полярной форме.
Предоставляет ли стандартная библиотека более эффективный способ преобразования декартового комплекса в его полярную форму? Я нашел только полярный метод, который делает противоположное.
Я был бы довольно удивлен, если бы какая-то часть работы могла фактически быть разделена в вычислении этих двух результатов. Обратите внимание, что для расчета амплитуды и фазы используются не только разные функции, но даже разные подходы. Это очень отличается от случая вычисления, например, синуса и косинуса вместе, где практически не сложнее получить оба результата одновременно и разделить их, чем получить один или другой только.
Форма z = r e ^ (iφ) не лечит р а также φ любым симметричным образом, не давая никаких оснований полагать, что его обратное должно. На самом деле требуется р ≥ 0 довольно произвольно для начала; в отличие от неоднозначности угла, которая определяется с точностью до целого числа, кратного 2π, это не результат выбора ветви, а просто геометрическая интуиция. Короче говоря, полярная форма не очень математически интересна.
История полностью меняется, если вы довольны s = журнал р вместо р, потому что тогда z = e^ (s + iφ) а также s + iφ = журнал Z. Таким образом, «просто» обобщающий логарифм для комплексных чисел делает свое дело, ваши два ответа сохраняются в действительной и мнимой частях результата. std::log
расширен для комплексных чисел в <complex>
,
Попробуйте немного сравнительного анализа. Это может быть тот случай, когда log
+ real
+ imag
+ exp
быстрее (с использованием оптимизации), чем abs
+ arg
,
Насколько я могу найти, стандартная библиотека не предоставляет объект, который содержит комплексное число в полярной форме. Если вам нужна эта функциональность, вам придется либо реализовать этот класс самостоятельно, либо найти стороннюю библиотеку, которая делает это.