- 다차원 배열 : 행렬의 곱셈, 두 행렬을 곱한 결과
- 행렬의 곱셈
두 행렬(matrix)을 곱한 결과를 출력한다.
int[][] m1 = {
{1, 2, 3},
{4, 5, 6}
};
int[][] m2 = {
{1, 2},
{3, 4},
{5, 6}
};
두 행렬의 곱셈이 가능하려면, m1의 열의 길이와 m2의 행의 길이가 같아야 한다는 조건이 있다. 위의 경우에는 m1이 2행 3열이고, m2가 3행 2열이므로 곱셈이 가능하다.
final int ROW = m1.length; // m1의 행 길이
final int COL = m2[0].length; // m2의 열 길이
final int M2_ROW = m2.length; // m2의 행 길이
int[][] m3 = new int[ROW][COL];
곱셈연산의 결과인 행렬 m3의 행의 길이는 m1의 행의 길이와 같고, 열의 길이는 m2의 열의 길이와 같다. 즉, 2행 3열인 행렬과 3행 2열인 행렬을 곱하면 결과는 2행 2열의 행렬이 된다.
// 행렬곱 m1 x m2의 결과를 m3에 저장
for(int i = 0 ; i < ROW ; i++) {
for(int j = 0 ; j < COL ; j++) {
for(int k = 0 ; k < M2_ROW ; k++) {
m3[i][j] += m1[i][k] * m2[k][j];
}
}
}
// 행렬 m3를 출력
for(int i = 0 ; i < ROW ; i++) {
for(int j = 0 ; j < COL ; j++) {
System.out.printf("%3d ", m3[i][j]);
}
System.out.println();
}
행렬 곱셈의 결과인 행렬 m3의 각 요소들은 위와 같이 계산된다.
- MultiArrEx3.java
package java_study;
public class MultiArrEx3 {
public static void main(String[] args) {
int[][] m1 = {
{1, 2, 3},
{4, 5, 6}
};
int[][] m2 = {
{1, 2},
{3, 4},
{5, 6}
};
final int ROW = m1.length; // m1의 행 길이
final int COL = m2[0].length; // m2의 열 길이
final int M2_ROW = m2.length; // m2의 행 길이
int[][] m3 = new int[ROW][COL];
// 행렬곱 m1 x m2의 결과를 m3에 저장
for(int i = 0 ; i < ROW ; i++) {
for(int j = 0 ; j < COL ; j++) {
for(int k = 0 ; k < M2_ROW ; k++) {
m3[i][j] += m1[i][k] * m2[k][j];
}
}
}
// 행렬 m3를 출력
for(int i = 0 ; i < ROW ; i++) {
for(int j = 0 ; j < COL ; j++) {
System.out.printf("%3d ", m3[i][j]);
}
System.out.println();
}
}
}
참고문헌 : 남궁성(2016), Java의 정석, 도우출판