Эффективно преобразовывая комплекс в его полярную форму

Это легко конвертировать std::complex c в полярную форму:

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

Однако это две отдельные операции для получения величины и фазы. Оптимизация, как алгоритмическая, так и в реализации, могла бы быть возможной, если бы стандартная библиотека предоставляла единственный метод для преобразования std::complex в своей полярной форме.

Предоставляет ли стандартная библиотека более эффективный способ преобразования декартового комплекса в его полярную форму? Я нашел только полярный метод, который делает противоположное.

2

Решение

Я был бы довольно удивлен, если бы какая-то часть работы могла фактически быть разделена в вычислении этих двух результатов. Обратите внимание, что для расчета амплитуды и фазы используются не только разные функции, но даже разные подходы. Это очень отличается от случая вычисления, например, синуса и косинуса вместе, где практически не сложнее получить оба результата одновременно и разделить их, чем получить один или другой только.

Форма z = r e ^ (iφ) не лечит р а также φ любым симметричным образом, не давая никаких оснований полагать, что его обратное должно. На самом деле требуется р ≥ 0 довольно произвольно для начала; в отличие от неоднозначности угла, которая определяется с точностью до целого числа, кратного 2π, это не результат выбора ветви, а просто геометрическая интуиция. Короче говоря, полярная форма не очень математически интересна.

История полностью меняется, если вы довольны s = журнал р вместо р, потому что тогда z = e^ (s + iφ) а также s + iφ = журнал Z. Таким образом, «просто» обобщающий логарифм для комплексных чисел делает свое дело, ваши два ответа сохраняются в действительной и мнимой частях результата. std::log расширен для комплексных чисел в <complex>,

Попробуйте немного сравнительного анализа. Это может быть тот случай, когда log + real + imag + exp быстрее (с использованием оптимизации), чем abs + arg,

2

Другие решения

Насколько я могу найти, стандартная библиотека не предоставляет объект, который содержит комплексное число в полярной форме. Если вам нужна эта функциональность, вам придется либо реализовать этот класс самостоятельно, либо найти стороннюю библиотеку, которая делает это.

0

По вопросам рекламы [email protected]