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

C++で行列の行列式を求める方法を解説

このチュートリアルでは、C++を使って行列の行列式(determinant)を求める方法を学びます。再帰的な余因子展開を利用することで、任意のサイズの正方行列に対して行列式を計算できます。

行列式を求める手順

まず、全体の流れを確認しましょう。

  • 行列を初期化します。
  • 行列式を求める関数を作成します。
    • 行列のサイズが1または2の場合は、直接計算します。これは簡単な処理です。
    • 行列式・小行列・符号用の変数を初期化します。
    • 1から行列のサイズNまで繰り返し処理を行います。
    • 現在注目している要素に対応する小行列(その要素の行と列を除いた要素すべて)を作成します。
    • 現在の要素とその余因子の積を行列式に加算します。
    • 符号を反転させます。
  • 最後に、求めた行列式を出力します。

サンプルコード

それでは、実際のコードを見てみましょう。

#include <bits/stdc++.h>
using namespace std;
#define N 3

// 小行列を作成する関数
void subMatrix(int mat[N][N], int temp[N][N], int p, int q, int n) {
    int i = 0, j = 0;
    for (int row = 0; row < n; row++) {
        for (int col = 0; col < n; col++) {
            // 注目している要素の行・列はスキップする
            if (row != p && col != q) {
                temp[i][j++] = mat[row][col];
                if (j == n - 1) {
                    j = 0;
                    i++;
                }
            }
        }
    }
}

// 行列式を再帰的に求める関数
int determinantOfMatrix(int matrix[N][N], int n) {
    int determinant = 0;
    if (n == 1) {
        return matrix[0][0];
    }
    if (n == 2) {
        return (matrix[0][0] * matrix[1][1]) - (matrix[0][1] * matrix[1][0]);
    }
    int temp[N][N], sign = 1;
    for (int i = 0; i < n; i++) {
        subMatrix(matrix, temp, 0, i, n);
        determinant += sign * matrix[0][i] * determinantOfMatrix(temp, n - 1);
        sign = -sign;
    }
    return determinant;
}

int main() {
    int mat[N][N] = {{2, 1, 3}, {6, 5, 7}, {4, 9, 8}};
    cout << "Determinant: " << determinantOfMatrix(mat, N) << endl;
    return 0;
}

実行結果

上記のプログラムを実行すると、次のような結果が得られます。

Determinant: 36

コードのポイント

このアルゴリズムでは、余因子展開(ラプラス展開)と呼ばれる手法を再帰的に適用しています。1行目の各要素について、その要素を含まない小行列の行列式を掛け合わせ、符号を交互に切り替えながら合計していくことで、元の行列の行列式が求まります。

なお、この再帰的なアプローチの計算量はO(n!)と非常に大きいため、大きな行列を扱う場合はLU分解などの効率的な手法を検討するとよいでしょう。

まとめ

このチュートリアルについて質問がある場合は、コメント欄でお気軽にお尋ねください。

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

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

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

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