C++で多次元配列を使って2つの行列を乗算する方法【サンプルコード付き】
行列とは
行列(マトリックス)とは、数値を行と列の形式で長方形状に配置した配列のことです。例えば、3行3列からなる3×3行列は以下のように表されます。
8 6 3 7 1 9 5 1 9
この記事では、多次元配列を使用して2つの行列の積を計算するC++プログラムを紹介します。
行列乗算プログラムの全体コード
2つの行列を掛け合わせるC++プログラムは以下の通りです。
サンプルコード
#include<iostream>
using namespace std;
int main() {
int product[10][10], r1=2, c1=3, r2=3, c2=3, i, j, k;
int a[2][3] = { {2, 4, 1} , {2, 3, 9} };
int b[3][3] = { {1, 2, 3} , {3, 6, 1} , {2, 9, 7} };
if (c1 != r2) {
cout<<"Column of first matrix should be equal to row of second matrix";
} else {
cout<<"The first matrix is:"<<endl;
for(i=0; i<r1; ++i) {
for(j=0; j<c1; ++j)
cout<<a[i][j]<<" ";
cout<<endl;
}
cout<<endl;
cout<<"The second matrix is:"<<endl;
for(i=0; i<r2; ++i) {
for(j=0; j<c2; ++j)
cout<<b[i][j]<<" ";
cout<<endl;
}
cout<<endl;
for(i=0; i<r1; ++i)
for(j=0; j<c2; ++j) {
product[i][j] = 0;
}
for(i=0; i<r1; ++i)
for(j=0; j<c2; ++j)
for(k=0; k<c1; ++k) {
product[i][j]+=a[i][k]*b[k][j];
}
cout<<"Product of the two matrices is:"<<endl;
for(i=0; i<r1; ++i) {
for(j=0; j<c2; ++j)
cout<<product[i][j]<<" ";
cout<<endl;
}
}
return 0;
}実行結果
The first matrix is: 2 4 1 2 3 9 The second matrix is: 1 2 3 3 6 1 2 9 7 Product of the two matrices is: 16 37 17 29 103 72
プログラムの解説
1. 行列の初期化
まず、2つの行列aとbを多次元配列として次のように初期化しています。
int a[2][3] = { {2, 4, 1} , {2, 3, 9} };
int b[3][3] = { {1, 2, 3} , {3, 6, 1} , {2, 9, 7} };ここで、行列aは2行3列、行列bは3行3列のサイズを持っています。
2. 乗算可能かどうかのチェック
行列の乗算が成立するためには、「1つ目の行列の列数」と「2つ目の行列の行数」が一致している必要があります。この条件が満たされない場合は乗算ができないため、エラーメッセージを表示するようにしています。
if (c1 != r2) {
cout<<"Column of first matrix should be equal to row of second matrix";
}3. 行列の表示
続いて、ネストされたforループ(二重ループ)を使って、行列aとbの要素を順番に表示します。
cout<<"The first matrix is:"<<endl;
for(i=0; i<r1; ++i) {
for(j=0; j<c1; ++j)
cout<<a[i][j]<<" ";
cout<<endl;
}
cout<<endl;
cout<<"The second matrix is:"<<endl;
for(i=0; i<r2; ++i) {
for(j=0; j<c2; ++j)
cout<<b[i][j]<<" ";
cout<<endl;
}
cout<<endl;4. 積の計算
まず結果を格納するproduct[][]配列をすべて0で初期化します。その後、三重のforループを使用して、行列aとbの各要素同士を掛け合わせ、その総和を求めることで積を計算します。
for(i=0; i<r1; ++i)
for(j=0; j<c2; ++j) {
product[i][j] = 0;
}
for(i=0; i<r1; ++i)
for(j=0; j<c2; ++j)
for(k=0; k<c1; ++k) {
product[i][j]+=a[i][k]*b[k][j];
}この計算式「product[i][j] += a[i][k] * b[k][j]」は、行列乗算の定義に基づいたもので、結果行列の各要素は「1つ目の行列の行ベクトル」と「2つ目の行列の列ベクトル」の内積として求められます。
5. 結果の出力
最後に、計算結果であるproduct行列を二重ループで画面に出力します。
cout<<"Product of the two matrices is:"<<endl;
for(i=0; i<r1; ++i) {
for(j=0; j<c2; ++j)
cout<<product[i][j]<<" ";
cout<<endl;
}まとめ
このように、C++では多次元配列と多重ループを組み合わせることで、行列の乗算をシンプルに実装できます。ポイントは以下の3点です。
- 乗算の可否を確認する(1つ目の行列の列数=2つ目の行列の行数)
- 結果格納用の配列を必ず0で初期化する
- 三重ループで内積を計算する
行列演算は画像処理や機械学習など、さまざまな分野で応用される基礎技術なので、ぜひマスターしておきましょう。
-
接続行列を使ってグラフを表現するC++プログラムの解説
接続行列(インシデンス行列)とはグラフの接続行列(インシデンス行列)は、グラフをメモリ上に格納するためのもうひとつの表現方法です。隣接行列と異なり、接続行列は正方行列ではありません。そのサイズは V × E で表されます。ここで V はグラフの頂点数、E は辺の数です。この行列では、各行に頂点が配置され、各列に辺が配置されます。ある辺 e {u, v} に対しては、列 e のうち頂点 u と頂点 v に対応する位置に「1」がマークされます。これにより、「どの頂点がどの辺に接続しているか」という情報を直感的に把握できます。接続行列の計算量とメモリ使用量接続行列による表現では、構築時に O(V ×
-
隣接行列を使ってグラフを表現するC++プログラムの解説
グラフの隣接行列(Adjacency Matrix)とは、サイズが V × V の正方行列のことです。ここでの V はグラフ G の頂点数を表します。行列の行と列にはそれぞれ頂点が対応しており、頂点 i から頂点 j への辺が存在する場合は、i 行 j 列の要素に「1」(重み付きグラフの場合は非ゼロの値)を格納します。辺が存在しない場合は、その位置には「0」が入ります。 隣接行列表現の計算量 隣接行列は計算時に O(V2) の記憶領域を必要とします。グラフが最大数の辺を持つ場合でも最小数の辺しか持たない場合でも、必要なメモリ量は同じです。つまり、辺の数に依存せず常に V × V 分の領域を確