2

OpenCV で複素数値の行列方程式を実装しようとしています。私は正常に動作するMATLABでプロトタイプを作成しました。方程式から始めます (正確な MATLAB 実装):

kernel = exp(1i .* k .* Circ3D) .* z ./ (1i .* lambda .* Circ3D .* Circ3D)

その中で

1i = complex number
k = constant (float)
Circ3D = real-valued matrix of known size
lambda = constant (float)
.* = element-wise multiplication
./ = element-wise division

結果は、複素数値の行列です。必要な Circ3D マトリックスを CV_32F として生成することに成功しましたが、複素数 i による乗算が問題を引き起こしています。OpenCV のドキュメントから、複雑な行列は単純に 2 チャネルの行列 (CV_32FC2) であることを理解しています。

本当の問題は、i を定義する方法にあります。私はいくつかのオプションを試しましたが、その中で i を次のように定義しています

cv::Vec2d complex = cv::Vec2d(0,1);

次に、行列を掛けます

kernel = complex * Circ3D

しかし、これは機能しません (期待していませんでしたが)。std::complex で何かをする必要があると思いますが、何がわかりません( http://docs.opencv.org/modules/core/doc/basic_structures.html )。

助けてくれてありがとう。

編集: この投稿を書いた直後に、 i を次のように定義することで、いくつかの進歩を遂げました。

std::complex<float> complex(0,1)

次に、次のように複雑な値を割り当てることができます。

kernel.at<std::complex<float>>(i,j) = cv::exp(complex * k * Circ3D.at<float>(i,j)) * ...
z / (complex * lambda * pow(Circ3D.at<float>(i,j),2));

ただし、これはループで機能するため、手順が非常に遅くなります。一発でできる方法はありますか?

4

2 に答える 2

2

OpenCV はstd::complex単純な数値のペアのように扱います (ドキュメントの例を参照してください)。算術演算に関する特別な規則は適用されません。直接乗算することでこれを克服しstd::complexます。基本的に、これは単純です。自動複素数演算 (現在行っているように) または自動ベクトル化 (行列で OpenCV 関数を使用する場合) を選択しました。

あなたの場合、すべての複雑な計算を自分で行う必要があると思います。複素数値のC{ai + b}行列を 2 つの行列A{a}ととして格納しB{b}ます。べき乗は自分で実装してください。スカラーの乗算と加算は問題になりません。

于 2012-12-04T11:10:09.260 に答える