• ベストアンサー

逆行列の高速解法

C言語を用いて逆行列を計算するアルゴリズムのうち, 計算時間が短いプログラム例を教えていただけませんでしょうか?

  • norioP
  • お礼率73% (147/200)

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

  • ベストアンサー
回答No.1

数値計算のアルゴリズムはどれもメリットとデメリットがあります。問題にしている行列はどのような行列か教えて下さい。専門家からの回答もつきやすくなりますよ。

その他の回答 (4)

  • iykm
  • ベストアンサー率22% (5/22)
回答No.5

#4です。GOTO BLAS というものもあり、2割ほど高速なようです。

参考URL:
http://www.cs.utexas.edu/users/flame/goto/
norioP
質問者

お礼

ありがとうございます. 引き続き参考にさせていただきました.

  • iykm
  • ベストアンサー率22% (5/22)
回答No.4

既存のライブラリを使うのが、高速なように思います。 LAPACK, CLAPACK, LAPACK++の何れかに、さらにATLASによるBLASのチューニングを 行えば、自作のプログラムより一桁近く速くなるように思います。

norioP
質問者

お礼

ありがとうございます. 参考にさせていただきます.

回答No.3

一般に連立一時方程式を解く際には逆行列を経由すると精度が落ちたり計算時間もかかります。行列が疎行列か密行列かで適したアルゴリズムが違うのですが、どれぐらいの次元のどんな成分の行列を何回ぐらい解かれるでしょうか?それはタイムクリティカルな部分の演算ですか?

norioP
質問者

お礼

ご返答ありがとうございました. 疎行列とは0要素の多い行列という意味だとしますと, 疎行列ではないようです. 行列の次数は最大で8です. 演算は下の御礼に記したものです. ただし,実時間制御にもちいるため, 精度よりも高速性を重視しております.

回答No.2

#1です。 勝手に固有値問題と勘違いしてしまいました。済みません。とりあえずLU分解で良いんじゃないですか?

参考URL:
http://www.fuka.info.waseda.ac.jp/~kozo/suuchi/simple_equation/simple_equation_4.html
norioP
質問者

お礼

抱えている問題は, X={(I-A)^(-1)}*(I+A) Y={(I-A)^(-1)}*B    A:正方,B:非正方 です.やはりLU分解の方法が最速でしょうか?

関連するQ&A

  • 逆行列を求めるアルゴリズムとコード化

    正則な正方行列Aの逆行列A^(-1)を求めるための数値計算のアルゴリズムを考えています。 AX=Bの場合、Xを求めるプログラムはガウスの消去法等でコード化することはできます。理論的にはA^(-1)があるとそれを左からかけるとXが求まりますが、そうなるとXとA^(-1)は同じ立ち位置なのかなと思ったのですが。XがわかってもA^(-1)はすぐには求まらないのでしょうか。未知数の数が違う(A^(-1)は3x3で、Xは3)のでそういうことになるのかと思いますが。逆行列は小行列で展開して求めていくという方向もあります。コンピュータで逆行列を求める計算アルゴリズムについてよろしくお願いします。行列のサイズとしては100x100程度まではいきたいのですが。

  • (4×4)行列の逆行列の求め方について

    以下の問題がわかりません。 どなたか簡単な解き方がわかる方いらっしゃいませんでしょうか。 下の行列について、逆行列を求めなさい。 (4×4)行列で要素は以下。 a -b -c -d b a -d c c d a -b d -c b a 答えは、 1/(a^2+b^2+c^2+d^2)*(以下の要素の行列) a b c d -b a d -c -c -d a b -d c -b a 余因子行列を使って一つ一つの要素を16回計算すれば出るのですが、 時間がかかりすぎてしまいます。 何か良いやり方はないでしょうか。

  • 逆行列求めたい

    今逆行列計算を行いたいと思い、LAPACK(Fortran)でがんばっておりますが、簡単な行列だとうまくいきますが、状態の悪い行列ではうまくいかないみたいです。計算上このような行列を計算しなければならなく困ってます。 ZGETRI,ZGETRFをつかってますが,いろいろと調べるとZLANGE,ZGECONを使っているとも見つけましたが、使い方がいまいちわかりません。 どなたかご教授いただけないでしょうか?

  • BASIC:行列式の値を求めるプログラム

    BASIC言語で行列式の計算を求めるプログラムを作りたいのですが、どなたか具体例等で教えていただけると助かります。

  • 行列の逆行列について

    行列の逆行列について 行列の逆行列を求める問題です。 掃き出し法や余因子行列を利用して求める等 いろいろ求め方はあると思いますが次の場合どうすれば良いでしょうか? 次の行列の逆行列を求めなさい。 ただしaは複素数とする。 |1 a 0 0| |1 a 0 0| |0 1 a 0| |0 1 a 0| |0 0 1 a| |0 0 1 a| |0 0 0 1| |a 0 0 1| 複素数であれば普段通りの計算は出来ないですよね? 回答お願いします。

  • 逆行列の求め方

      1 ,3 ,5 ,7 1行目 1^2,3^2,5^2,7^2  2行目  1^3,3^3,5^3,7^3  3行目 1^4,3^4,5^4,7^4  4行目 4×4の行列の逆行列を求めよ。 ただ単に逆行列を求めるのであれば、計算は大変になるが、この行列を単位行列に変形することで求められるが、累乗をいかした解法を問題作成者は期待しているとおもうので、それに添った解答はどうなるのか。 よい解答を教えてください。

  • 3×3の逆行列の計算

    3×3の逆行列の計算 吐き出し法以外の逆行列の計算の仕方をすっかり忘れてしまいました・・・。 0.4 0.708 -0.081 -0.226 1.165 0.046 0 0 0.918 これの逆行列を求めたいのですが、吐き出し法でできる気がしません・・・。 どうやればいいのでしょうか? よろしくお願いします。

  • 行列の和の逆行列について

    情報処理系の数学(カルマンフィルタとか)では(A+B+C)^(-1)とか(A+BCF)^(-1)のように行列の和(あるいは行列と行列の積の和)の逆行列の表式があり、公式のようなものが与えられていたりします。その中で例えば(A+B+C)^(-1)でA,B,Cとは何かと言うと行列(普通は正方行列?)なわけですが、例えば単に1つの値(スカラー)であった場合は逆数というのは自然な拡張としてあり得ると思います。1行1列の行列の対角成分だけの行列と見なすわけです。これはいいだろうと思います。問題はAなどがベクトルだったときです。これは計算できないということでいいでしょうか。ベクトルだったら1行N列の行列(N行1列でも)ということであり、逆行列が定義できないということになるでしょうか。カルマンフィルタなどではベクトルではないかと思うものが式の中に入っているのですが。Rで実験してみるとAの逆行列はsolve(A)だけで求まります。Aがスカラーだったら予想どおり逆数なります。ベクトルだったらエラーです。やはりベクトルだと当然ダメということでしょうか。

  • 逆行列の計算

    こんばんは。 逆行列の計算についてどうしてもわからない所があるので教えてください。 行列(B+C*Rt)があります。(Rtは行列Rの転置) ここで、B=[B11 0; B21 B22]{;は改行}の構造化行列で次元は,(行*列)の順番でB11がn+n,0がn*m(0は0行列),B21がm*n,B22がm*mです。 行列Cに関しては、C=[B21;0]でB21がn*m,0がm*mの0行列。 行列Rtに関しては、Rt=[0 Iq]で0がm*nの0行列、Iqがm*mの単位行列です。 この時(B+C*Rt)の逆行列がわかりません。 答えは、B~-B~*{C*(Iq+Rt*B~*C)~*Rt}*B~になると思うのですが・・・(~は逆行列です) どなたか解かる方お願いします。

  • R言語の逆行列計算について

    R言語の初心者です ある本の通りにプログラムを進めていったところ逆行列を求める際以下のようなことが起こりました > A<-matrix(c(4,7,0,5),nrow=2) > A [,1] [,2] [1,] 4 0 [2,] 7 5 > Ainv<-solve(A) > Ainv [,1] [,2] [1,] 0.25 -1.110533e-17 [2,] -0.35 2.000000e-01 > Ainv %*% A [,1] [,2] [1,] 1.000000e+00 -5.552664e-17 [2,] -5.551115e-17 1.000000e+00 なぜか逆行列を求めるとき複素数が入ってしまいます 本ではちゃんとした値が出ています。すいませんがこれを直して複素数を除く逆行列を求められる 設定方法を教えてください