- ベストアンサー
CLAPACKでの複素数の扱いについて
CLAPACKを使って連立一次方程式、固有値問題を解くプログラムを 作成しています。dgesv_などの倍精度浮動小数点に対するルーチンは 扱うことができたのですが、複素数に対するルーチンを扱うときに 引数等をどのようにしたら良いか全くわかりません。分かる方が いたら教えてください。 使用言語はC言語で、複素数の定義は struct complex{ double real; double image; } としています。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
訂正です。 引数は全部ポインタなので、 cgesv_(n, nrhs, a, lda, ipiv, b, ldb, info) ↓ cgesv_(&n, &nrhs, &a, &lda, &ipiv, &b, &ldb, &info); ですね。 セミコロンまで抜けていましたし。 申し訳ありませんでした。 あと、 typedef double doublereal; typedef struct { doublereal r, i; } doublecomplex; なので、倍精度にしたいときはzで始まる関数群を使ってください。 int zgesv_(integer *n, integer *nrhs, doublecomplex *a, integer *lda, integer *ipiv, doublecomplex *b, integer *ldb, integer *info);
その他の回答 (1)
- hofuhofu
- ベストアンサー率70% (336/476)
clapack.tgzで検索するとVer.3のものがあったので、それを展開してf2c.hを見てみたところ、complexの宣言がすでにされていました。 typedef struct { real r, i; } complex; ユーザーが勝手に定義しちゃまずいです。 ちなみに、integerとrealは、 typedef long int integer; typedef float real; となっています。 たとえばdgesv_に似たcgesv_という関数はclapack.hで次のように宣言されています。 int cgesv_(integer *n, integer *nrhs, complex *a, integer * lda, integer *ipiv, complex *b, integer *ldb, integer *info) dgesv_が、 int dgesv_(integer *n, integer *nrhs, doublereal *a, integer*lda, integer *ipiv, doublereal *b, integer *ldb, integer *info); ですから、doublerealがcomplexに変わっただけですね。 complex a,b; a.r = 0.0; a.i = 0.0; b.r = 0.0; b.i = 0.0; などとして、 cgesv_(n, nrhs, a, lda, ipiv, b, ldb, info) とすれば、呼び出せるはずです。 (n,nrhs,lda,ipiv,ldb,infoはinteger(long int)型。dgesv_と同様)
お礼
詳細な説明ありがとうございます。 説明を見ていて、CLAPACKの使い方が間違っていた ことに気づきました。 f2c.hとclapack.hをincludeせずにCLAPACKを使って いたため、complexを勝手に作ってしまい、関数に渡す 引数もintegerではなくintやdoubleとしていました。 f2c.hを使えばよかったのですね。 これからCLAPACKについてもうちょっと調べてみようと 思います。 回答ありがとうございました。