Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

주어진 행렬의 대각합(Trace)과 노름(Normal)을 구하는 자바 프로그램


이 글에서는 주어진 행렬의 대각합(Trace)노름(Normal)을 구하는 방법을 알아봅니다. 행렬의 노름은 행렬에 포함된 모든 원소를 제곱하여 더한 뒤, 그 값의 제곱근을 취한 것을 의미하며, 대각합(트레이스)은 행렬의 주대각선(왼쪽 위에서 오른쪽 아래 방향)에 위치한 모든 원소들의 합을 말합니다.

두 값의 계산 과정은 아래 예시와 같습니다.

입력 및 출력 예시

입력값

정의된 행렬:
2 3 4
5 2 3
4 6 9

기대되는 출력값

대각합(Trace): 13.0
노름(Normal): 14.142135623730951

알고리즘

1단계 - 시작(START)
2단계 - 정수형 행렬 input_matrix 선언
3단계 - 행렬의 값을 정의한다.
4단계 - 대각합 계산: 두 개의 for 루프를 사용해 행렬의 각 원소를 순회하면서 대각선 원소들을 더한 값을 저장한다.
5단계 - 노름 계산: 두 개의 for 루프를 사용해 각 원소의 제곱합을 구한 뒤, 그 값의 제곱근을 계산하여 저장한다.
6단계 - 결과를 화면에 출력한다.
7단계 - 종료(STOP)

예제 1: main 함수에서 모든 연산 처리하기

아래 예제는 모든 연산을 하나의 'main' 함수 안에서 함께 수행하는 방식입니다.

public class NormalAndTrace {
   public static void main(String args[]) {
      int[][] input_matrix = {
         {2, 3, 4},
         {5, 2, 3},
         {4, 6, 9}
      };
      int i, j, matrix_size = 3;
      double trace = 0, square = 0, normal = 0;
      System.out.println("정의된 행렬은 다음과 같습니다: ");
      for(i = 0; i < matrix_size; i++) {
         for(j = 0; j < matrix_size; j++)
         System.out.print(input_matrix[i][j]+" ");
         System.out.println(" ");
      }
      System.out.println("\n행렬의 대각합(Trace)은 다음과 같습니다: ");
      for(i = 0; i < matrix_size; i++) {
         for(j = 0; j < matrix_size; j++) {
            if(i == j) {
               trace = trace + (input_matrix[i][j]);
            }
         }
      }
      System.out.println(trace);
      System.out.println("\n행렬의 노름(Normal)은 다음과 같습니다: ");
      for(i = 0; i < matrix_size; i++) {
         for(j = 0; j < matrix_size; j++) {
            square = square + (input_matrix[i][j])*(input_matrix[i][j]);
         }
      }
      normal = Math.sqrt(square);
      System.out.println(normal);
   }
}

실행 결과

정의된 행렬은 다음과 같습니다:
2 3 4
5 2 3
4 6 9

행렬의 대각합(Trace)은 다음과 같습니다:
13.0

행렬의 노름(Normal)은 다음과 같습니다:
14.142135623730951

예제 2: 객체지향 방식으로 함수 분리하기

이번에는 대각합과 노름을 계산하는 연산 부분을 별도의 함수로 캡슐화하여, 객체지향 프로그래밍(OOP) 스타일에 맞게 작성합니다.

public class NormalAndTrace {
   static int matrix_size = 3;
   static void normal_trace(int input_matrix[][]){
      int i, j;
      double trace = 0, square = 0, normal = 0;
      System.out.println("\n행렬의 대각합(Trace)은 다음과 같습니다: ");
      for(i = 0; i < matrix_size; i++) {
         for(j = 0; j < matrix_size; j++) {
            if(i == j) {
               trace = trace + (input_matrix[i][j]);
            }
         }
      }
      System.out.println(trace);
      System.out.println("\n행렬의 노름(Normal)은 다음과 같습니다: ");
      for(i = 0; i < matrix_size; i++) {
         for(j = 0; j < matrix_size; j++) {
            square = square + (input_matrix[i][j])*(input_matrix[i][j]);
         }
      }
      normal = Math.sqrt(square);
      System.out.println(normal);
   }
   public static void main(String args[]) {
      int i, j;
      int[][] input_matrix = { {2, 3, 4},
         {5, 2, 3},
         {4, 6, 9}
      };
      System.out.println("정의된 행렬은 다음과 같습니다: ");
      for(i = 0; i < matrix_size; i++) {
         for(j = 0; j < matrix_size; j++)
         System.out.print(input_matrix[i][j]+" ");
         System.out.println(" ");
      }
      normal_trace(input_matrix);
   }
}

실행 결과

정의된 행렬은 다음과 같습니다:
2 3 4
5 2 3
4 6 9

행렬의 대각합(Trace)은 다음과 같습니다:
13.0

행렬의 노름(Normal)은 다음과 같습니다:
14.142135623730951

참고로, 두 예제 모두 행렬의 모든 원소를 한 번씩만 순회하므로 시간 복잡도는 O(n²)입니다. 따라서 n×n 크기의 행렬에서도 대각합과 노름을 효율적으로 계산할 수 있습니다.