Page List

Search on the blog

2011年1月25日火曜日

C++で行列計算

C++で行列計算をしてみましょう。
オペレータのオーバーライドを使用すれば、結構簡単に行列の計算を行うためのクラスを作成することが出来ます。
今回は、行列の足算と掛算をやってみます。

では、ソースです。
  1. class MTX {  
  2. public:  
  3.  vector<vector<int> > val;  
  4.   
  5.  MTX(int n, int m) {  
  6.      vector<int> zeros;  
  7.      REP(i, m)zeros.push_back(0);  
  8.      REP(i, n)val.push_back(zeros);  
  9.  }  
  10.   
  11.  MTX operator+(const MTX mtx) {  
  12.      int n = this->val.size();  
  13.      int m = this->val[0].size();  
  14.      MTX ret(n, m);  
  15.      ret.val = this->val;  
  16.   
  17.      REP(i, n)REP(j, m)  
  18.          ret.val[i][j] = this->val[i][j] + mtx.val[i][j];  
  19.      return ret;  
  20.  }  
  21.   
  22.  MTX operator*(const MTX mtx) {  
  23.      int n = this->val.size();  
  24.      int l = this->val[0].size();  
  25.      int m = mtx.val[0].size();  
  26.   
  27.      MTX ret(n, m);  
  28.      REP(i, n)REP(j, m)REP(k, l)  
  29.          ret.val[i][j] += this->val[i][k] * mtx.val[k][j];  
  30.   
  31.      return ret;  
  32.  }  
  33. };  
以下のように使います。3*3行列の足算と掛算をやってみましょう。

  1. int main() {  
  2.   MTX a(3,3), b(3, 3);  
  3.   
  4.   REP(i, 3)REP(j, 3)  
  5.       cin >> a.val[i][j];  
  6.   
  7.   REP(i, 3)REP(j, 3)  
  8.       cin >> b.val[i][j];  
  9.   
  10.   MTX c = a + b;  
  11.   MTX d = a * b;  
  12.   REP(i, 3)REP(j, 3)  
  13.       printf("%d%c", c.val[i][j], j==2 ? '\n' : ' ');  
  14.   REP(i, 3)REP(j, 3)  
  15.       printf("%d%c", d.val[i][j], j==2 ? '\n' : ' ');  
  16. }  
と、こんな感じです。

2 件のコメント:

  1. >オーバーライド

    オーバーロードですね。

    返信削除
  2. Riskさん>

    演算子を再定義したので、”オーバーライド”かと思ったのですが。。
    でもこの場合は、”演算子の挙動が、被演算子の種類によって変わる”という見かたもできるので、おっしゃるとおりオーバーロードが正ですかね??

    返信削除