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分解などの効率的な手法を検討するとよいでしょう。
まとめ
このチュートリアルについて質問がある場合は、コメント欄でお気軽にお尋ねください。
-
C++でべき等行列を判定するプログラムの作成方法
行数を r、列数を c とする行列 M[r][c] が与えられ、r = c となる正方行列を考えます。この記事では、与えられた正方行列がべき等行列(アイデンポテント行列)であるかどうかを判定するC++プログラムを解説します。 べき等行列とは 行列 M がべき等行列であるとは、行列 M と自分自身の積が元の行列 M と等しくなること、すなわち M × M = M が成り立つことを指します。 例えば、次の行列を見てください。 この行列を自分自身で掛け合わせても、結果は元の行列とまったく同じになります。したがって、この行列はべき等行列であると言えます。 べき等行列の代表的な例としては、ベクトルを
-
C++でグラフの隣接行列を実装する方法【サンプルコード付き解説】
隣接行列とは グラフの隣接行列(Adjacency Matrix)とは、V×Vのサイズを持つ正方行列のことです。ここでVはグラフGの頂点数を表します。行列の行と列にはそれぞれ頂点が対応付けられ、頂点iから頂点jへの辺が存在する場合は、i行目・j列目の要素に1が格納されます(重み付きグラフの場合は、辺の重みなどの非ゼロの値が入ります)。辺が存在しない場合は0が格納されます。 なお、無向グラフの場合、辺は双方向につながりを持つため、隣接行列は必ず対称行列になります。つまり、adj[i][j]とadj[j][i]は常に同じ値となります。 隣接行列表現の計算量 空間計算量: 隣接行列にはO(V²)