• ベストアンサー

CLAPACKでの複素数の扱いについて

CLAPACKを使って連立一次方程式、固有値問題を解くプログラムを 作成しています。dgesv_などの倍精度浮動小数点に対するルーチンは 扱うことができたのですが、複素数に対するルーチンを扱うときに 引数等をどのようにしたら良いか全くわかりません。分かる方が いたら教えてください。 使用言語はC言語で、複素数の定義は struct complex{ double real; double image; } としています。

質問者が選んだベストアンサー

  • ベストアンサー
  • hofuhofu
  • ベストアンサー率70% (336/476)
回答No.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);

chanple
質問者

お礼

詳細な説明ありがとうございます。 説明を見ていて、CLAPACKの使い方が間違っていた ことに気づきました。 f2c.hとclapack.hをincludeせずにCLAPACKを使って いたため、complexを勝手に作ってしまい、関数に渡す 引数もintegerではなくintやdoubleとしていました。 f2c.hを使えばよかったのですね。 これからCLAPACKについてもうちょっと調べてみようと 思います。 回答ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • hofuhofu
  • ベストアンサー率70% (336/476)
回答No.1

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_と同様)

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • イプシロン値を使った比較関数

    先日、↓でイプシロン値の記述方法を質問し、お陰様で一つ賢くなりました・・・ https://okwave.jp/qa/q9625188.html 今回、このイプシロン値を使用して2つの浮動小数点数の比較関数を作ってみました。 ところが、意図した結果になりません(数値により正しく判断できない場合がある) //倍精度浮動小数点数比較関数 //相対誤差内であれば、両者は等しいとする //戻り値 a=bのとき:0 a≠bのとき:0以外 #include <math.h> int CompareDoubleValue(const double a, const double b) { //引数の差の絶対値とイプシロン値を使用した相対誤差を比較する //1と引数の大きい方の数値を比較して、より大きい数値をイプシロン値 //と乗算して相対誤差とする if (fabs(a-b) <= (DBL_EPSILON*fmax(double(1), fmax(a, b)))) return(0); else return(-1) ; } ※fabs():倍精度浮動小数点数の絶対値を求める標準関数 ※fmax():2つの引数(倍精度浮動小数点数)の大きいほうの値を返す標準関数 何が悪いのかわからず困っております。 お教え頂けると幸いです。 よろしくお願いします。

  • C言語:2つの複素数(分数)の四則演算

    下記のプログラムを組んでみて、発展として分数の形で複素数の四則演算のプログラムを作りたいのですが、どうにもややこしく、困っています。 よろしければ御指導よろしくお願いします。 /* 複素数を表す構造体 2つの複素数の四則演算 */ #include <stdio.h> #include <stdlib.h> typedef struct { double real; /* 実数部分 */ double imag; /* 虚数部分 */ }COMPLEX; /* 二つの複素数の和を返す */ COMPLEX comp_add(COMPLEX x, COMPLEX y) { COMPLEX tmp; tmp.real = x.real + y.real; /* 実数部分の和 */ tmp.imag = x.imag + y.imag; /* 虚数部分の和 */ return (tmp); } /* 二つの複素数の差を返す */ COMPLEX comp_sub(COMPLEX x, COMPLEX y) { COMPLEX tmp; tmp.real = x.real - y.real; /* 実数部分の差 */ tmp.imag = x.imag - y.imag; /* 虚数部分の差 */ return (tmp); } /* 二つの複素数の積を返す */ COMPLEX comp_mul(COMPLEX x, COMPLEX y) { COMPLEX tmp; tmp.real = (x.real * y.real) - (x.imag * y.imag); tmp.imag = (x.real * y.imag) + (y.real * x.imag); return (tmp); } /* 二つの複素数の商を返す */ COMPLEX comp_div(COMPLEX x, COMPLEX y) { COMPLEX tmp; tmp.real =(x.real*y.real+x.imag*y.imag)/(y.real*y.real+y.imag*y.imag); tmp.imag = (x.imag*y.real-x.real*y.imag)/(y.real*y.real+y.imag*y.imag); return (tmp); } int main( int argc, char **argv ) { COMPLEX a, b, c; a.real = strtod( argv[1], NULL ); a.imag = strtod( argv[2], NULL ); b.real = strtod( argv[3], NULL ); b.imag = strtod( argv[4], NULL ); c = comp_add(a, b); /* 複素数の和を c に代入 */ printf( "(%f+j%f)*(%f+j%f)=(%3.1lf+j%3.1lf)\n", a.real,a.imag,b.real,b.imag,c.real,c.imag ); c = comp_sub(a, b); /* 複素数の差を c に代入 */ printf( "(%f+j%f)*(%f+j%f)=(%3.1lf+j%3.1lf)\n", a.real,a.imag,b.real,b.imag,c.real,c.imag ); c = comp_mul(a, b); /* 複素数の積を c に代入 */ printf( "(%f+j%f)+(%f+j%f)=(%3.1lf+j%3.1lf)\n", a.real,a.imag,b.real,b.imag,c.real,c.imag ); c = comp_div(a, b); /* 複素数の商を c に代入 */ printf( "(%f+j%f)+(%f+j%f)=(%3.1lf+j%3.1lf)\n", a.real,a.imag,b.real,b.imag,c.real,c.imag ); return( 0 ); }

  • C言語 構造体 2

    三つの構造体α、β、γの実数部、虚数部の値(実数)をそれぞれ入力し、 (α+γ)(γ+β)を求めて表示せよ。 ただし、複素数を、実数部と虚数部に対応するメンバで構成される構造体として表し、複素数の加算用関数c_add()と乗算用関数c_mul()を作成して、これを利用すること。 これらの関数は、sとtを複素数を表す構造体としたとき、c_add(s,t)、c_mul(s,t)と呼び出すと、それぞれ戻り値として、sとtを加算、または乗算した結果である複素数の構造体を返すものとする。 という問題なのですが。。。。 #include<stdio.h> int main(void){ struct complex{ double real; double imaginary; }; struct complex[3]; double real; double imag; printf("α= "); scanf("%d,&real); scanf(%d,&imag); printf("β= "); scanf("%d,&real); scanf(%d,&imag); printf("γ="); scanf("%d,&real); scanf(%d,&imag); (α+γ)=c_add(α,γ); (β+γ)=c_add(β,γ); (α+γ)(β+γ)=c_mul(α+γ,β+γ) result=(α+γ)(β+γ) printf("result= "); まで友達と考えてみたのですが、このあとどうしたらいいのかわかりません>< どなたかお教えください。。お願いします。。。

  • VAX浮動小数点形式

    NASAのホームページからダウンロードしてきたデータを画像化しようとしているのですが、そのデータの型の説明のところにVAX_REALと書いてあり、いろいろ調べた結果VAX浮動小数点形式というのがあるらしいということまでは分かったのですが、具体的にVAX浮動小数点形式がどういうものなのか分かりません。 IEEE浮動小数点形式とは違うものなのでしょうか? あと、VAX浮動小数点形式というのはC言語などでふつうに読み出せるものなのでしょうか? どなたか分かる方教えてください。

  • MySQLの浮動小数点の定義について

    いまMySQLの浮動小数点の定義を行っているのですが, ↓↓↓↓↓ create talbe [table_name]( id int not null auto_increment, data1 double [(1)], primary key(id) ); の(1)のdouble型の精度の宣言方法が分かりません…。 どうやって宣言すればいいのか教えていただけませんか? 具体的に例を挙げていただけたら幸いです。

  • 浮動小数点とセットで使用される「e」について

    Javaの参考書で、以下のコードがありました。 『double d2=1.2345e-72』 質問1:このコードの「e」について、常用対数のことでしょうか? 質問2:1.2345e-72は、『1.2345*10の-72乗』でしょうか? 質問3:浮動小数点において、なぜ常用対数は必要なのでしょうか? その理由は、「浮動小数点の桁数を簡単にできるから。またdoubleの表現できる精度より高いそれ表現できるから」でしょうか?

    • ベストアンサー
    • Java
  • VBAのsingle,doubleのデータ型のE+,E-

    VBAのデータ型longやsingleの E+やE-は何を表しているのでしょうか? 単精度浮動小数点型 3.4028235E+38~などです。 また、single doubleはそれぞれ-3.4028~、-1.797~ などと書いてありますが、1万台で小数点以下の数値がある値、たとえば17,562.256はどのデータ型を使えばよいのでしょうか?

  • C言語で複素数の計算を行いたいと思っております。

    C言語で複素数の計算を行いたいと思っております。 プログラミングソフトは、C言語を始めよう!を用いています。 しかし変数定義の仕方が分かりません。 複素計算とは具体的に、 exp( i π) (i は虚数単位)です 最初に#include<complex.h>を行いましたが 変数の定義の方法、exp( i π)の定義の方法が いまひとつわからない状態です。 保存するときに、Cファイルではなく、 拡張子をcppに変更してCPPファイルでコンパイルを行っています。 exp( i π)を計算可能なプログラムを 教えて頂ければ幸いです。 ご面倒かと思いますが 回答お願いします。

  • バイナリから実数を取得したいのですが・・・

    C++にてバイナリデータから倍精度の浮動小数を取得したいと考えています。 バイナリの中にリトルエンディアン形式で倍精度の浮動小数が64ビット幅に収められています。 これをdouble型の変数に代入したいのですが、どうすれば(できれば簡単な方法で)値を代入できるでしょうか? ご教授お願いします。 データのサンプルを念のために記載させて頂きます。 B2 9C 05 DA 7D 40 6C 3F -> 3.448720745086919e-3

  • 【C++】複素数で配列を使いたい

    昨日QNo.3714177で「複素数complex.hがおかしいのでしょうか?」 と言うタイトルで質問させて頂いた、C言語初心者です。 お世話になっております。 今日一日中やっており、C++も少しは理解できるようになったぞっと思った矢先、またまた、問題が発生しました。 複素数の中で、配列を使おうとするとエラーが発生します。 ソースは以下の通りです。上段に私が書いたもの、下段に前回の質問時に教えて頂き、動いたものを記載しております。 どこが間違えているのか教えて頂きたく思います。 よろしくお願い致します。 ============================================================================================================ #include <iostream> #include <iomanip> #include <complex> using namespace std; int main () { int i; for (i=0; i<3; i++) { std::complex <double> Z[i] (i,i); std::cout << "Z[" << i << "]= " << Z[i] << "\n"; } return 0; } //ここより下のみでは動きます。 #if0 #include <iostream> #include <complex> int main() { std::complex<double> x(1.2, 3.4); std::complex<double> y(5.6, 7.8); std::cout << "x = " << x <<"\n"; std::cout << "x = " << y <<"\n"; } #endif ============================================================================================================ Borland C++ 5.6 for Win32 Copyright (c) 1993, 2002 Borland keisan.cpp: エラー E2313 keisna.cpp 11: 定数式が必要(関数 main() ) エラー E2034 keisna.cpp 11: 'int' 型は 'complex<double>[1]' 型に変換できない(関数 main() ) エラー E2293 keisna.cpp 11: ) が必要(関数 main() ) *** 3 errors in Compile ***

このQ&Aのポイント
  • 印刷がピンク色にしか印刷されない状況に悩んでいます。EPSON社製品に関する質問です。
  • ピンク色にしか印刷されない問題について、EPSON社製品に対する質問です。
  • EPSON社製品で印刷すると、なぜかピンク色にしか印刷されません。ご教示ください。
回答を見る

専門家に質問してみよう