C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++で加算演算子をオーバーロードして2つの行列を加算する方法

C++では演算子オーバーロードを利用することで、クラスオブジェクト同士に対して「+」などの演算子を直感的な形で適用できます。本記事では、2つの行列 mat1mat2 を加算して3つ目の行列を作成する処理を、加算演算子 + のオーバーロードによって実装する方法を解説します。

入力例と出力例

たとえば、次の2つの行列を入力とした場合を考えます。

行列1:

58
96
79

行列2:

83
47
63

このとき、対応する位置の要素同士を足し合わせた結果として、次の出力が得られます。

1311
1313
1312

解き方のアプローチ

この問題は、以下の手順で解くことができます。

  • 加算演算子 operator+ をオーバーロードし、もう一方の行列 mat を const 参照の引数として受け取るようにします。
  • 現在の行列(自分自身)の要素をコピーした2次元配列 vv を用意します。
  • 二重の for ループですべての要素を走査します。外側のループ変数 i は行方向(0 から vv のサイズ未満まで)、内側のループ変数 j は列方向(0 から vv[0] のサイズ未満まで)を1ずつ増やしながら繰り返します。
  • 各要素に対して vv[i][j] += mat.a[i][j] を実行し、対応する要素同士を加算します。
  • 計算が完了したら、結果の vv を使って新しい Matrix オブジェクトを生成して返します。

それでは、実際の実装例を見て理解を深めましょう。

C++での実装例

#include <iostream>
#include <vector>
using namespace std;

class Matrix {
public:
    Matrix() {}
    // コピーコンストラクタ
    Matrix(const Matrix& x) : a(x.a) {}
    // 2次元vectorから初期化するコンストラクタ
    Matrix(const vector<vector<int>>& v) : a(v) {}
    // 加算演算子の宣言
    Matrix operator+(const Matrix&);
    vector<vector<int>> a;
    // 行列の中身を表示するメンバ関数
    void display(){
        for(int i = 0; i<a.size(); i++){
            for(int j = 0; j<a[i].size(); j++){
                cout << a[i][j] << " ";
            }
            cout << endl;
        }
    }
};

// 加算演算子の定義
Matrix Matrix::operator+(const Matrix& m){
    // 自分自身の要素をコピー
    vector<vector<int>> vv = a;
    for (int i=0; i<vv.size(); i++){
        for (int j=0; j<vv[0].size(); j++){
            // 対応する要素同士を加算
            vv[i][j] += m.a[i][j];
        }
    }
    // 計算結果の行列を返す
    return Matrix(vv);
}

int main(){
    vector<vector<int>> mat1 = {{5,8},{9,6},{7,9}};
    vector<vector<int>> mat2 = {{8,3},{4,7},{6,3}};
    Matrix m1(mat1), m2(mat2), res;
    res = m1 + m2;
    res.display();
}

入力

{{5,8},{9,6},{7,9}}, {{8,3},{4,7},{6,3}}

出力

13 11
13 13
13 12

コードのポイント

  • operator+ はメンバ関数として定義されており、左辺の行列(自分自身)と右辺の行列 m の対応する要素を加算します。
  • 元の行列を書き換えないよう、まず要素を vv にコピーしてから加算を行うため、m1 + m2 のように呼び出しても m1 の中身は変化しません。
  • 戻り値として新しい Matrix オブジェクトを返すことで、res = m1 + m2; のようなスカラー型と同じ自然な記述が可能になります。
  1. C++で2つの2進数文字列を加算するプログラムの書き方

    2つの2進数を表す文字列が与えられたとき、それらを加算した結果を求め、その結果を2進数の文字列として返すことを考えます。2進数とは、0か1のいずれかで表現される数値のことです。2進数同士を足し合わせる際には、以下のような2進数特有の加算ルールに従う必要があります。0+0 → 0 0+1 → 1 1+0 → 1 1+1 → 0(繰り上がり1)入力例str1 = {11}, str2 = {1}出力例100入力例str1 = {110}, str2 = {1}出力例111問題を解くためのアプローチ両方の文字列を末尾(最下位桁)から走査する対応する桁の2進数同士を加算する1と1を足した場合は、その桁

  2. C++でべき等行列を判定するプログラムの作成方法

    行数を r、列数を c とする行列 M[r][c] が与えられ、r = c となる正方行列を考えます。この記事では、与えられた正方行列がべき等行列(アイデンポテント行列)であるかどうかを判定するC++プログラムを解説します。 べき等行列とは 行列 M がべき等行列であるとは、行列 M と自分自身の積が元の行列 M と等しくなること、すなわち M × M = M が成り立つことを指します。 例えば、次の行列を見てください。 この行列を自分自身で掛け合わせても、結果は元の行列とまったく同じになります。したがって、この行列はべき等行列であると言えます。 べき等行列の代表的な例としては、ベクトルを