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

다차원 배열을 활용한 행렬 곱셈 자바(Java) 프로그램 구현하기

이 글에서는 다차원 배열(2차원 배열)을 사용하여 두 개의 행렬을 곱하는 방법을 알아보겠습니다. 행렬은 요소들이 행(row)과 열(column) 형태로 배열된 구조를 가지며, m개의 행과 n개의 열로 이루어진 행렬을 m × n 행렬이라고 부릅니다.

행렬의 각 요소는 a[i][j]와 같이 표현할 수 있으며, 이는 요소 a가 i번째 행, j번째 열에 위치한다는 의미입니다.

아래는 실제 동작 예시입니다.

입력 예시

첫 번째 행렬:
2 3 4
5 2 3
4 6 9

두 번째 행렬:
1 5 3
5 6 3
8 1 5

출력 결과

두 행렬의 곱은:
49 32 35
39 40 36
106 65 75

알고리즘

1단계 - 시작(START)
2단계 - 세 개의 정수형 행렬 선언: input_matrix_1, input_matrix_2, resultant_matrix
3단계 - 값 정의
4단계 - for 반복문으로 두 행렬의 모든 요소를 순회하면서, 첫 번째 행렬의 [i][j] 위치 요소와 두 번째 행렬의 해당 행의 각 요소를 곱한 후 더하여 그 값을 결과 행렬의 [i][j] 위치에 저장합니다. 첫 번째 행렬의 모든 요소에 대해 반복합니다.
5단계 - 결과 출력
6단계 - 종료(STOP)

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

첫 번째 예제에서는 모든 연산을 'main' 함수 하나 안에 묶어서 처리합니다.

public class MultiplyMatrices {
   public static void main(String[] args) {
      int matrix_size = 3;
      int[][] input_matrix_1 = {
         {2, 3, 4},
         {5, 2, 3},
         {4, 6, 9}
      };
      System.out.println("The first matrix is defined as: ");
      for (int i = 0; i < matrix_size; i++) {
         for (int j = 0; j < matrix_size; j++) {
            System.out.print(input_matrix_1[i][j] + " ");
         }
         System.out.println();
      }
      int[][] input_matrix_2 = {
         {1, 5, 3},
         {5, 6, 3},
         {8, 1, 5}
      };
      System.out.println("The second matrix is defined as: ");
      for (int i = 0; i < matrix_size; i++) {
         for (int j = 0; j < matrix_size; j++) {
            System.out.print(input_matrix_2[i][j] + " ");
         }
      System.out.println();
   }
   int[][] resultant_matrix = new int[matrix_size][matrix_size];
   for(int i = 0; i < matrix_size; i++) {
      for (int j = 0; j < matrix_size; j++) {
         for (int k = 0; k < matrix_size; k++) {
            resultant_matrix[i][j] += input_matrix_1[i][k] * input_matrix_2[k][j];
         }
      }
   }
   System.out.println("\n The product of two matrices is: ");
   for(int[] row : resultant_matrix) {
      for (int column : row) {
         System.out.print(column + " ");
      }
      System.out.println();
      }
   }
}

실행 결과

The first matrix is defined as:
2 3 4
5 2 3
4 6 9

The second matrix is defined as:
1 5 3
5 6 3
8 1 5

The product of two matrices is:
49 32 35
39 40 36
106 65 75

예제 2: 객체 지향 프로그래밍 방식 적용

두 번째 예제에서는 연산 로직을 별도의 함수로 분리하여 객체 지향 프로그래밍(OOP) 스타일로 구현합니다. 코드의 재사용성과 가독성이 향상됩니다.

public class MultiplyMatrices {
   static int matrix_size = 3;
   static void multiply(int input_matrix_1[][], int input_matrix_2[][]){
      int[][] resultant_matrix = new int[matrix_size][matrix_size];
      for(int i = 0; i < matrix_size; i++) {
         for (int j = 0; j < matrix_size; j++) {
            for (int k = 0; k < matrix_size; k++) {
               resultant_matrix[i][j] += input_matrix_1[i][k] * input_matrix_2[k][j];
            }
         }
      }
      System.out.println("\n The product of two matrices is: ");
      for(int[] row : resultant_matrix) {
         for (int column : row) {
            System.out.print(column + " ");
         }
         System.out.println();
      }
   }
   public static void main(String[] args) {
      int matrix_size = 3;
      int[][] input_matrix_1 = {
         {2, 3, 4},
         {5, 2, 3},
         {4, 6, 9}
      };
      System.out.println("The first matrix is defined as: ");
      for (int i = 0; i < matrix_size; i++) {
         for (int j = 0; j < matrix_size; j++) {
            System.out.print(input_matrix_1[i][j] + " ");
         }
      System.out.println();
      }
      int[][] input_matrix_2 = { {1, 5, 3},
         {5, 6, 3},
         {8, 1, 5}
      };
      System.out.println("The second matrix is defined as: ");
      for (int i = 0; i < matrix_size; i++) {
         for (int j = 0; j < matrix_size; j++) {
            System.out.print(input_matrix_2[i][j] + " ");
         }
         System.out.println();
      }
      multiply(input_matrix_1, input_matrix_2);
   }
}

실행 결과

The first matrix is defined as:
2 3 4
5 2 3
4 6 9
The second matrix is defined as:
1 5 3
5 6 3
8 1 5

The product of two matrices is:
49 32 35
39 40 36
106 65 75

핵심 포인트 정리

행렬 곱셈의 핵심은 삼중 for 반복문입니다. 바깥쪽 두 반복문(i, j)은 결과 행렬의 위치를 결정하고, 가장 안쪽 반복문(k)은 첫 번째 행렬의 i번째 행과 두 번째 행렬의 j번째 열에 있는 요소들을 차례대로 곱하여 누적합을 계산합니다. 즉, resultant_matrix[i][j] = Σ input_matrix_1[i][k] × input_matrix_2[k][j] 공식을 코드로 구현한 것입니다.

또한 주의할 점은 행렬 곱셈이 성립하려면 첫 번째 행렬의 열 수와 두 번째 행렬의 행 수가 일치해야 한다는 것입니다. 위 예제에서는 두 행렬이 모두 3×3 크기이므로 문제없이 곱셈이 가능합니다.