2016-12-21 7 views
2

を複雑に変換することは、その極形式にstd::complexcを変換するのは簡単です:が効率的にその極形式に

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

しかし、これらは、大きさと位相を取得するには、2つの別々の操作です。 std::complexをその極座標に変換する標準ライブラリによって提供される単一のメソッドがある場合、アルゴリズムまたは実装のいずれかの最適化が可能である可能性があります。

標準ライブラリは、デカルト複合体を極座標形式に変換する効率的な方法を提供しますか?私はその逆を行うpolarメソッドを見つけました。

+0

これは本当にアプリケーションのボトルネックですか? –

+0

あなたはどれくらい正確に取引する意思がありますか? – user3528438

+0

@ user3528438なし – Danra

答えて

2

これらの2つの結果を計算する際に、作業の一部を実際に共有できるのであれば、私はむしろ驚くでしょう。振幅と位相を計算するために、異なる機能だけでなく異なるアプローチも使用されていることに注意してください。これは、正弦と余弦を一緒に計算する場合とは非常に異なります。たとえば、正弦と余弦を一緒に計算する場合とは異なり、結果を同時に取得することと分離することは、どちらか一方を取得するよりも難しくありません。

形態Z = R eは^(Iφ)その逆べき信じるための任意の根拠を与えない、対称的な方法のいずれかの種類にR及びφを扱いません。実際にはr≧0が必要です。角度のあいまいさとは異なり、これは2πの整数倍まで定義されますが、これは分岐選択の結果ではなく、単に幾何学的直観の結果です。要するに、極座標形式はあまり数学的に興味深いものではありません。

あなたはS =代わりRRをログに満足しているならば、Z = E ^(S +Iφ)とS +Iφ =ログので話は、完全に変わりますz。したがって、複素数の対数を「単に」一般化すると、その2つの答えが結果の実数部と虚数部に格納されます。 std::logは、複素数の場合は<complex>に拡張されています。

少しベンチマークを試してください。 log + real + imag + expは、abs + argよりも高速です(最適化を使用)。

0

標準ライブラリには、極座標形式の複素数を保持するオブジェクトはありません。この機能を使用するには、このクラスを自分で実装するか、そうするサードパーティライブラリを見つける必要があります。

+0

極座標クラスは必要ありません。std :: complexを受け取り、その大きさと位相の両方を計算します(たとえば、出力ポインタで返すなど)。 – Danra

+0

Ah。その場合は、自分で実装するか、そうするライブラリを見つけなければなりません。 –

+0

次のようなものがあります。 void calculatePolar(std :: complex c、double&magnitude、double&phase){ magnitude = abs(c); phase = arg(c); } –

関連する問題