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

【C++入門】行列の乗算を実行するプログラムの書き方をわかりやすく解説

行列とは

行列(マトリックス)とは、数値を行と列の形式で長方形状に配置したものです。数学やプログラミングにおいて、データを整理して扱うための基本的な構造として広く利用されています。

例えば、次のようなものが行列に該当します。

3×2の行列は、3行2列で構成され、以下のように表されます。

8 1
4 9
5 6

行列乗算プログラムの全体像

ここでは、C++を使って2つの行列の積を計算するプログラムを紹介します。まずは完全なコードを見てみましょう。

サンプルコード

#include<iostream>
using namespace std;
int main() {
    int product[10][10], r1=3, c1=3, r2=3, c2=3, i, j, k;
    int a[3][3] = { {2, 4, 1} , {2, 3, 9} , {3, 1, 8} };
    int b[3][3] = { {1, 2, 3} , {3, 6, 1} , {2, 4, 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
3 1 8
The second matrix is:
1 2 3
3 6 1
2 4 7
Product of the two matrices is:
16 32 17
29 58 72
22 44 66

プログラムの解説

1. 行列の初期化

上記のプログラムでは、まず2つの行列 a と b を以下のように初期化しています。

int a[3][3] = { {2, 4, 1} , {2, 3, 9} , {3, 1, 8} };
int b[3][3] = { {1, 2, 3} , {3, 6, 1} , {2, 4, 7} };

2. 乗算可能かどうかのチェック

行列の乗算を行うためには、最初の行列の列数が、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ループを使って2つの行列 a と b の積を求めます。

具体的には、外側の2つのループが結果行列の行と列を走査し、内側のループが対応する行と列の要素同士を掛け合わせて合計する仕組みです。

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];
}

5. 計算結果の出力

最後に、計算で得られた積を画面に表示します。

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++における行列乗算の実装方法を解説しました。ポイントは以下の通りです。

  • 行列は2次元配列で表現できる
  • 乗算の前提条件として「1つ目の行列の列数=2つ目の行列の行数」が必要
  • 三重のforループで各要素の積和を計算する
  • 計算量は O(n³) となるため、大規模な行列では注意が必要

行列演算はグラフィックス処理や機械学習など、さまざまな分野で活用される重要な技術です。ぜひ本記事のコードを参考に、実際に手を動かして試してみてください。

  1. C++で対合行列(インボリュートリー行列)を判定するプログラムの実装方法

    行列 M[r][c] が与えられたとき、「r」は行数、「c」は列数を表します。ここでは r = c、つまり正方行列である場合を考えます。この記事では、与えられた正方行列が対合行列(インボリュートリー行列)であるかどうかを判定する方法を解説します。 対合行列とは 対合行列とは、ある行列を自分自身と掛け合わせたとき、その積が単位行列になるような行列のことです。単位行列 I とは、主対角成分がすべて 1 で、それ以外の要素がすべて 0 である行列を指します。 したがって、行列 M が対合行列であるための必要十分条件は次のように表せます。 M × M = I ここで、M は任意の行列、I は単位行列で

  2. C++でグラフの隣接行列を実装する方法【サンプルコード付き解説】

    隣接行列とは グラフの隣接行列(Adjacency Matrix)とは、V×Vのサイズを持つ正方行列のことです。ここでVはグラフGの頂点数を表します。行列の行と列にはそれぞれ頂点が対応付けられ、頂点iから頂点jへの辺が存在する場合は、i行目・j列目の要素に1が格納されます(重み付きグラフの場合は、辺の重みなどの非ゼロの値が入ります)。辺が存在しない場合は0が格納されます。 なお、無向グラフの場合、辺は双方向につながりを持つため、隣接行列は必ず対称行列になります。つまり、adj[i][j]とadj[j][i]は常に同じ値となります。 隣接行列表現の計算量 空間計算量: 隣接行列にはO(V²)