Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++로 대각 우세 행렬(Diagonally Dominant Matrix) 판별하기

행렬의 모든 행에 대해 대각선 요소의 절댓값이 해당 행에 있는 다른 모든 비대각선 요소들의 절댓값 합보다 크거나 같으면, 이 행렬을 대각 우세 행렬(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으로 모든 행이 조건을 만족하기 때문에 대각 우세 행렬로 판별됩니다.