C++で対角優位行列を判定する方法
対角優位行列(対角優占行列)とは、すべての行において、その行の対角成分の絶対値が、同じ行内の他の非対角成分の絶対値の合計以上であるような行列のことです。この記事では、C++を使って与えられた行列が対角優位行列かどうかを判定するプログラムの実装方法を解説します。
定数Nの定義
まず、行列の次元を表す定数int型変数Nに値3を設定します。
const int N = 3;
isDDM関数の実装
isDDM(int mat[N][N], int n)は、行列とそのサイズを受け取り、真偽値(bool)を返す関数です。関数内部では、ネストされたforループを使用して行列の行と列を順番に走査し、各行の全要素の絶対値を合計してsum変数に加算していきます。
bool isDDM(int mat[N][N], int n){
for (int i = 0; i < n; i++){
int sum = 0;
for (int j = 0; j < n; j++)
sum += abs(mat[i][j]);
次に、現在の合計値から対角成分の絶対値を差し引きます。これにより、その行の非対角成分の絶対値の合計が得られます。
sum -= abs(mat[i][i]);
続いて、対角成分の絶対値が合計値より小さいかどうかを判定します。もし1つでも対角成分が合計値より小さい場合はfalseを返して関数を終了します。ループを最後まで回っても条件を満たさない要素がなければ、すべての行が対角優位の条件を満たしているためtrueを返します。
bool isDDM(int mat[N][N], int n){
for (int i = 0; i < n; i++){
int sum = 0;
for (int j = 0; j < n; j++)
sum += abs(mat[i][j]);
sum -= abs(mat[i][i]);
if (abs(mat[i][i]) < sum)
return false;
}
return true;
}
main関数での判定結果の表示
最後に、isDDM関数の戻り値に基づいて、main関数内でその行列が対角優位行列であるかどうかを出力します。
if(isDDM(mat,matSize)){
cout << "yes,its a diagonally dominant matrix";
} else {
cout << "NO, its not a diagonally dominant matrix";
}
実装例
それでは、行列が対角優位かどうかを判定する実際の実装例を見てみましょう。
#include <iostream>
const int N = 3;
using namespace std;
bool isDDM(int mat[N][N], int n){
for (int i = 0; i < n; i++){
int sum = 0;
for (int j = 0; j < n; j++)
sum += abs(mat[i][j]);
sum -= abs(mat[i][i]);
if (abs(mat[i][i]) < sum)
return false;
}
return true;
}
int main(){
int matSize = 3;
int mat[N][N] = {
{ 3, -2, 1 },
{ 1, -3, 2 },
{ -1, 2, 4 }
};
if(isDDM(mat,matSize)){
cout << "yes,its a diagonally dominant matrix";
} else {
cout << "NO, its not a diagonally dominant matrix";
}
return 0;
}
出力
上記のコードを実行すると、以下の出力が得られます。
yes,its a diagonally dominant matrix
この結果は、サンプル行列の各行を確認することで理解できます。1行目は |3| ≥ |-2| + |1| = 3、2行目は |-3| ≥ |1| + |2| = 3、3行目は |4| ≥ |-1| + |2| = 3 となっており、すべての行で対角成分の絶対値が非対角成分の絶対値の合計以上になっているため、この行列は対角優位行列と判定されます。
-
C++で解くスパイラル行列 III:時計回りに全マスを訪問するアルゴリズム
本記事では、R行C列の2次元グリッドを時計回りの渦巻き(スパイラル)状に巡回し、すべてのマスを訪問した順に座標を求める問題「スパイラル行列 III」をC++で解く方法を解説します。 問題の概要 R行C列の2次元グリッドを考えます。スタート地点は (r0, c0) で、最初は東向きに面しています。グリッドの北西の角は第1行・第1列に位置し、南東の角は最終行・最終列にあります。 私たちは時計回りの渦巻き状に歩きながら、グリッド内のすべてのマスを訪問します。途中でグリッドの境界外に出た場合でも、そのまま外側を歩き続け、後で再びグリッド内に戻ることがあります。 求めるのは、訪問した順番に並べたグリッド
-
C++の配列パズル:減算演算子を使わずに「自分以外の要素の合計」を求める方法
今回は、配列に関する興味深い問題を紹介します。n個の要素を持つ配列が与えられ、それをもとに同じくn個の要素を持つ別の配列を作成します。ただし、新しい配列のi番目には、元の配列のi番目の要素を除いたすべての要素の合計を格納します。さらに重要な制約として、減算演算子(-)を使用してはいけないという条件が課されています。 問題のポイント もし減算が使えるのであれば、話は簡単です。まず全要素の合計を求めておき、そこからi番目の要素を引いた値を新しい配列のi番目に格納すればよいだけです。しかし、この問題では減算が禁止されているため、別のアプローチが必要になります。 そこで、各位置i(0〜n-1)について