C++で加算演算子をオーバーロードして2つの行列を加算する方法
C++では演算子オーバーロードを利用することで、クラスオブジェクト同士に対して「+」などの演算子を直感的な形で適用できます。本記事では、2つの行列 mat1 と mat2 を加算して3つ目の行列を作成する処理を、加算演算子 + のオーバーロードによって実装する方法を解説します。
入力例と出力例
たとえば、次の2つの行列を入力とした場合を考えます。
行列1:
| 5 | 8 |
| 9 | 6 |
| 7 | 9 |
行列2:
| 8 | 3 |
| 4 | 7 |
| 6 | 3 |
このとき、対応する位置の要素同士を足し合わせた結果として、次の出力が得られます。
| 13 | 11 |
| 13 | 13 |
| 13 | 12 |
解き方のアプローチ
この問題は、以下の手順で解くことができます。
- 加算演算子
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;のようなスカラー型と同じ自然な記述が可能になります。
-
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を足した場合は、その桁
-
C++でべき等行列を判定するプログラムの作成方法
行数を r、列数を c とする行列 M[r][c] が与えられ、r = c となる正方行列を考えます。この記事では、与えられた正方行列がべき等行列(アイデンポテント行列)であるかどうかを判定するC++プログラムを解説します。 べき等行列とは 行列 M がべき等行列であるとは、行列 M と自分自身の積が元の行列 M と等しくなること、すなわち M × M = M が成り立つことを指します。 例えば、次の行列を見てください。 この行列を自分自身で掛け合わせても、結果は元の行列とまったく同じになります。したがって、この行列はべき等行列であると言えます。 べき等行列の代表的な例としては、ベクトルを