プロが教えるわが家の防犯対策術!

N次の複素正方行列S,Tの積Uを計算するプログラムを作りたいのですが、実数で正方行列を計算するプログラムと
複素数の積、和のプログラム
struct complex
{
double re;
double im;
};
を作ったのですが、この二つをまとめるとプログラムができるらしいのですがまとめ方が全然わかりません。どのようにしたらいいかヒントなど教えてください。

A 回答 (2件)

実数の正方行列の積が計算できているということは、その、S, T, U の要素を表す配列がありますね?



おそらく、double の配列になっていると思います。
その配列の型を、struct complex にします。

そして、正方行列の積を計算するということは、配列 S の要素と T の要素の積を、U の要素に足し込むという計算をしているはずです。

その中の、例えば、

U += S * T;

を一度、

U = U + S * T;

と置き直します。(実際には配列の名前ではなくて、個々の要素のはず)

で、複素数の、和と積がそれぞれ関数として準備されているのであれば、それぞれ、
複素数の a + b が
struct complex add(strcunt complex a, struct complex b);

a * b が
struct complex mul(strcunt complex a, struct complex b);

などという関数になっているはずです。
そこで、上で書いた、 + と * を add と mul に置き換えて

U = add(U, mul(S, T));
と置き換えるだけです。

入出力は、適切な形で処理してください。
    • good
    • 0

私なら、自分でこういう計算のための関数を作らないで済ませる方法を探します。



具体的には、
(a) C99準拠のCコンパイラを使用しているなら自分で複素計算の関数を作らずに _Complex 型を使う。
(b) C++を使って問題ないのであればC++の標準ライブラリにある complexクラスを使う。
(c) C++でOKなら、さらにBoostライブラリをインストールして、行列演算までライブラリに任せてしまう。
(d) Matlabを使える環境にあるならMatlabをC言語から呼び出して使う。
(e) Matlabクローンでも良ければ Scilab をC言語から呼び出して使う。


複素数演算も行列演算も、自分で作ると時間がかかるし、処理速度も遅く、バグも作りこむことになります。本来の目的に注力するためにも、先人の知恵を使わせてもらうことをおすすめします。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


このQ&Aを見た人がよく見るQ&A