オペレータのオーバーライドを使用すれば、結構簡単に行列の計算を行うためのクラスを作成することが出来ます。
今回は、行列の足算と掛算をやってみます。
では、ソースです。
- class MTX {
- public:
- vector<vector<int> > val;
- MTX(int n, int m) {
- vector<int> zeros;
- REP(i, m)zeros.push_back(0);
- REP(i, n)val.push_back(zeros);
- }
- MTX operator+(const MTX mtx) {
- int n = this->val.size();
- int m = this->val[0].size();
- MTX ret(n, m);
- ret.val = this->val;
- REP(i, n)REP(j, m)
- ret.val[i][j] = this->val[i][j] + mtx.val[i][j];
- return ret;
- }
- MTX operator*(const MTX mtx) {
- int n = this->val.size();
- int l = this->val[0].size();
- int m = mtx.val[0].size();
- MTX ret(n, m);
- REP(i, n)REP(j, m)REP(k, l)
- ret.val[i][j] += this->val[i][k] * mtx.val[k][j];
- return ret;
- }
- };
- int main() {
- MTX a(3,3), b(3, 3);
- REP(i, 3)REP(j, 3)
- cin >> a.val[i][j];
- REP(i, 3)REP(j, 3)
- cin >> b.val[i][j];
- MTX c = a + b;
- MTX d = a * b;
- REP(i, 3)REP(j, 3)
- printf("%d%c", c.val[i][j], j==2 ? '\n' : ' ');
- REP(i, 3)REP(j, 3)
- printf("%d%c", d.val[i][j], j==2 ? '\n' : ' ');
- }
>オーバーライド
返信削除オーバーロードですね。
Riskさん>
返信削除演算子を再定義したので、”オーバーライド”かと思ったのですが。。
でもこの場合は、”演算子の挙動が、被演算子の種類によって変わる”という見かたもできるので、おっしゃるとおりオーバーロードが正ですかね??