행렬의 모든 행에 대해 대각선 요소의 절댓값이 해당 행에 있는 다른 모든 비대각선 요소들의 절댓값 합보다 크거나 같으면, 이 행렬을 대각 우세 행렬(Diagonally Dominant Matrix)이라고 합니다.
알고리즘 개요
먼저 행렬의 크기를 나타내는 상수 정수형 변수 N을 값 3으로 정의합니다.
const int N = 3;
isDDM(int mat[N][N], int n) 함수는 불리언(Boolean) 타입의 함수로, 행렬과 행렬의 크기를 인자로 받습니다. 함수 내부에서는 중첩 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 변수에는 대각선 요소를 제외한 나머지 요소들의 절댓값 합만 남게 됩니다.
sum -= abs(mat[i][i]);
이제 대각선 요소의 절댓값이 sum(나머지 요소들의 합)보다 작은지 검사합니다. 만약 하나라도 sum보다 작다면 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 함수가 반환한 값에 따라 해당 행렬이 대각 우세 행렬인지 아닌지를 화면에 출력합니다.
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
예제 행렬에서 첫 번째 행은 |3| ≥ |-2| + |1| = 3, 두 번째 행은 |-3| ≥ |1| + |2| = 3, 세 번째 행은 |4| ≥ |-1| + |2| = 3으로 모든 행이 조건을 만족하기 때문에 대각 우세 행렬로 판별됩니다.