逆行列

しん 「でね?さっき話に出た物理学情報処理論のレポなんだけど」
えてぃ「うん」
しん 「逆行列を解くプログラムを組めっていう話で」
えてぃ「昔あんたJavaで組んだじゃない」
しん 「今回はC++で組んだんだけどクラスで配列扱うとき、メモリの解放とかどうしていいかわからなくて色々なやんだよ」
えてぃ「あんたもまだまだってことね」
しん 「うん。かなり危険なクラスを実装したけど(メモリ解放されてないんじゃないかな?)一応動いたw」
えてぃ「危険ねぇ…」
しん 「出力結果はご覧の通り☆」

与えられた行列

 1 7 4 0 9 4 8 8 2 4
 5 5 1 7 1 1 5 2 7 6
 1 4 2 3 2 2 1 6 8 5
 7 6 1 8 9 2 7 9 5 4
 3 1 2 3 3 4 1 1 3 8
 7 4 2 7 7 9 3 1 9 8
 6 5 0 2 8 6 0 2 4 8
 6 5 0 9 0 0 6 1 3 8
 9 3 4 4 6 0 6 6 1 8
 4 9 6 3 7 8 8 2 9 1

行列式
-2.46236e+007

逆行列

 0.0534428 -0.246603 0.164124 -0.23521 -0.608325 0.383331 -0.0104392 0.177349 0.243515 -0.0973796
 -0.103144 -0.189622 0.0864063 0.0450671 0.0571182 -0.231828 0.151541 0.178357 -0.0580623 0.160997
 -0.286265 -0.080496 -0.0347225 0.244624 0.665528 -0.489517 0.00468794 -0.0690683 -0.04813 0.315146
 -0.226682 -0.106062 -0.0620586 0.313639 0.528936 -0.337643 -0.00827295 0.0364356 -0.167762 0.185289
 -0.169107 0.553116 -0.384661 0.396934 0.829119 -0.582944 0.132756 -0.456314 -0.230209 0.154031
 0.202631 -0.644096 0.318619 -0.332184 -0.760785 0.657964 -0.132238 0.439784 0.163117 -0.153052
 0.268603 0.211329 -0.0829196 -0.201031 -0.360367 0.341433 -0.129303 -0.0424064 0.0747714 -0.196681
 0.140499 -0.4623 0.326328 -0.197474 -0.586962 0.422229 -0.103851 0.292263 0.166118 -0.148314
 0.0214094 0.42748 -0.0926822 0.00438847 0.0590639 -0.0213634 0.00149905 -0.279843 -0.0288526 -0.0486887
 0.0523574 0.161772 -0.0511266 -0.030791 0.146989 -0.0635999 0.0318198 -0.0602618 -0.0236385 -0.0517302

逆行列とオリジナルの積

 1 0 0 0 0 0 0 0 0 0
 0 1 0 0 0 0 0 0 0 0
 0 0 1 0 0 0 0 0 0 0
 0 0 0 1 0 0 0 0 0 0
 0 0 0 0 1 0 0 0 0 0
 0 0 0 0 0 1 0 0 0 0
 0 0 0 0 0 0 1 0 0 0
 0 0 0 0 0 0 0 1 0 0
 0 0 0 0 0 0 0 0 1 0
 0 0 0 0 0 0 0 0 0 1

えてぃ「10×10行列の逆行列もとめたの?そりゃお疲れ様*1
しん 「頑張ったのは俺じゃなくてパソコンだけどな」
えてぃ「そりゃそうね。計算にどれくらいかかったの?」
しん 「35分」
えてぃ「C++で35分って相当なもんね」
しん 「本当はLU分解っていうもっと効率の良い計算方法があるんだけど、今回は普通にA^{-1} = 1/detA * A~{\~}再帰を使って解いた感じ」
えてぃ「ふーん。じゃあその方法使えばもっと速いんだ?」
しん 「mathematicaとかだったらもっと速いはず。使ったこと無いからわからないけど。いつか自分でLU分解実装したいな。NumericalRecipiも買ったし…*2そうそう。前にJava逆行列の演算プログラム組んだんだけどそのとき10*10の行列式を解かせたんだ」
えてぃ「うん」
しん 「そんときは1分12秒かかった」
えてぃ「今回のプログラムでは?」
しん 「12秒。まあ実行環境も違うし、テストになってないんだけど、まあこの違いは歴然だね」
えてぃ「ふむ。やっぱりC++ね」
しん 「うむ。さて、今回みたいにクラス内でポインタを扱う場合はメモリの解放のタイミングが難しいんだよね〜。俺の師匠に見せたら、『危険なプログラムだw』っていわれちゃったし、そのあたりも勉強しないとなぁ。見せられるソースじゃないし…。Effective C++More Effective C++読めってさ」
えてぃ「やることいっぱいね」
しん 「おぅ。でも暇よりはいいじゃないか」
えてぃ「前向きねw」
しん 「ぉぅ!がんばります☆」
えてぃ「ファイト!」

*1:授業での課題は3×3行列です。これはおまけw

*2:数値計算のバイブル。Cでかかれているのが残念。C++で書かれたエディションがあるらしいが、どうやら英語版のみらしい。