C++で対角優位行列を判定するプログラムの作成方法
このチュートリアルでは、C++を使って「与えられた行列が対角優位行列(対角優勢行列)かどうか」を判定するプログラムを作成します。
対角優位行列とは?
ある行列が対角優位行列であるとは、各行において、対角要素以外の要素の絶対値の合計が、その行の対角要素の絶対値以下であることを指します。
次の行列を見てみましょう。
4 2 1 3 5 2 2 4 7
この行列は対角優位行列です。理由は以下の通りです。
4 > 2 + 1 5 ≥ 3 + 2 7 > 4 + 2
すべての対角要素が、同じ行内の非対角要素の合計以上になっていることが確認できます。
解決手順
行列の各行・各列を順番に走査します。
その行の非対角要素の絶対値の合計を求めます。
合計値と対角要素の絶対値を比較します。
非対角要素の合計が対角要素より大きい場合は「No」を出力します。
すべての行で条件を満たしていれば「Yes」を出力します。
サンプルコード
それでは、実際のコードを見てみましょう。
#include <bits/stdc++.h>
using namespace std;
#define N 3
bool isDiagonallyDominantMatrix(int matrix[N][N], int n) {
for (int i = 0; i < n; i++) {
int sum = 0;
for (int j = 0; j < n; j++) {
if (i != j) {
sum += abs(matrix[i][j]);
}
}
if (abs(matrix[i][i]) < sum) {
return false;
}
}
return true;
}
int main() {
// int matrix[N][N] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
int matrix[N][N] = {{4, 2, 1}, {3, 5, 2}, {2, 4, 7}};
if (isDiagonallyDominantMatrix(matrix, 3)) {
cout << "Yes" << endl;
}
else {
cout << "No" << endl;
}
return 0;
}コードのポイント
abs()関数を使用することで、負の値を含む行列にも対応できます。時間計算量は O(n²) であり、n×n の行列に対して効率的に動作します。
実行結果
上記のコードを実行すると、次の出力が得られます。
Yes
コメントアウトされている {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}} の行列に変更すると、対角要素が非対角要素の合計より小さいため「No」と出力されます。
まとめ
このように、各行ごとに非対角要素の合計と対角要素を比較するだけで、対角優位行列かどうかを簡単に判定できます。数値解析や連立一次方程式の反復解法(ヤコビ法・ガウス=ザイデル法など)では、収束性の保証に関わる重要な概念なので、ぜひ理解しておきましょう。
このチュートリアルについて質問がある場合は、コメント欄でお気軽にお尋ねください。
-
C++で対合行列(インボリュートリー行列)を判定するプログラムの実装方法
行列 M[r][c] が与えられたとき、「r」は行数、「c」は列数を表します。ここでは r = c、つまり正方行列である場合を考えます。この記事では、与えられた正方行列が対合行列(インボリュートリー行列)であるかどうかを判定する方法を解説します。 対合行列とは 対合行列とは、ある行列を自分自身と掛け合わせたとき、その積が単位行列になるような行列のことです。単位行列 I とは、主対角成分がすべて 1 で、それ以外の要素がすべて 0 である行列を指します。 したがって、行列 M が対合行列であるための必要十分条件は次のように表せます。 M × M = I ここで、M は任意の行列、I は単位行列で
-
C++でグラフの隣接行列を実装する方法【サンプルコード付き解説】
隣接行列とは グラフの隣接行列(Adjacency Matrix)とは、V×Vのサイズを持つ正方行列のことです。ここでVはグラフGの頂点数を表します。行列の行と列にはそれぞれ頂点が対応付けられ、頂点iから頂点jへの辺が存在する場合は、i行目・j列目の要素に1が格納されます(重み付きグラフの場合は、辺の重みなどの非ゼロの値が入ります)。辺が存在しない場合は0が格納されます。 なお、無向グラフの場合、辺は双方向につながりを持つため、隣接行列は必ず対称行列になります。つまり、adj[i][j]とadj[j][i]は常に同じ値となります。 隣接行列表現の計算量 空間計算量: 隣接行列にはO(V²)