行列と行列の積

数値計算っぽい雰囲気のレポートに使うプログラムが、どうしてもうまくいかんなーと思ってたら行列の積を求める関数が死んでた。

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: データ 情報ではない みたいなことを言いたかった。

test