行列と行列の積
数値計算っぽい雰囲気のレポートに使うプログラムが、どうしてもうまくいかんなーと思ってたら行列の積を求める関数が死んでた。
double **mat_mat_multiply(double **result, double **x, double **y, int n){ int i, j, k; double **tmp = makeMatrix(n); for(i=0;i<n;++i){ for(j=0;j<n;++j){ double sum = 0; for(k=0;k<n;++k){ sum += x[i][k] * y[k][i]; } tmp[i][j] = sum; } } mat_copy(result, tmp, n); mat_free(tmp); return result; }
N×N の行列同士の積しかできねえじゃんだっせー、ってのは置いておくとして。
sum += x[i][k] * y[k][j];
の間違いです。なんかもう駄目だなもう。
あとなー、与えられた課題の「ほげほげという関数を作れ」的問題との兼ね合いから、こうしたけど、生の二次元配列で「行列」を表現するとかもどうだろうなー。mat_cols(Matrix hoge) とか mat_issymmetric(Matrix hoge) な関数とか使いたいじゃん。なので
typedef struct{ double **data; int col, row; } Matrix;
くらいのデータを「行列」とすべきなんじゃねーかなーとか思った。二次元配列だけだと、そのデータを扱う側の「これは N×N 行列」という事前情報がないと行列じゃない。
まあ学生実験のレポートだし、そもそもプログラミングの実験じゃなくて数値計算のレポートだからそんなことはどうでもいいんだけど。
まあなんだ。もう行列計算を自分で書くのはやめようと思った。
あれだ、きっと。
google: データ 情報ではない みたいなことを言いたかった。