Java
 Computer >> コンピューター >  >> プログラミング >> Java

Javaで多次元配列を使って行列の掛け算(積)を計算するプログラム


この記事では、多次元配列(2次元配列)を使用して、Javaで2つの行列の積を計算する方法を解説します。行列とは、要素が行と列の形式で配置されたものであり、m行n列の行列は「m × n 行列」と呼ばれます。

行列内の個々の値は「要素」と呼ばれ、a[i][j] のように表されます。これは、要素 a が i行目・j列目の位置に存在することを意味します。

実際の動作例を見てみましょう。

入力例:

1つ目の行列:
2 3 4
5 2 3
4 6 9

2つ目の行列:
1 5 3
5 6 3
8 1 5

期待される出力:

2つの行列の積は以下の通りです:
49 32 35
39 40 36
106 65 75

アルゴリズム

ステップ1 − 開始する
ステップ2 − input_matrix_1、input_matrix_2、resultant_matrix の3つの整数型行列を宣言する
ステップ3 − 値を定義する
ステップ4 − forループで両方の行列の各要素を反復処理し、1つ目の行列の [i][j] 位置の要素と、2つ目の行列の行の各要素を掛け合わせて合計し、その値を結果行列の [i][j] 位置に格納する。これを1つ目の行列のすべての要素に対して繰り返す
ステップ5 − 結果を表示する
ステップ6 − 終了する

例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("1つ目の行列:");
        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("2つ目の行列:");
        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 2つの行列の積は以下の通りです:");
        for(int[] row : resultant_matrix) {
            for (int column : row) {
                System.out.print(column + " ");
            }
            System.out.println();
        }
    }
}

出力

1つ目の行列:
2 3 4
5 2 3
4 6 9

2つ目の行列:
1 5 3
5 6 3
8 1 5

2つの行列の積は以下の通りです:
49 32 35
39 40 36
106 65 75

例2:オブジェクト指向で関数に分割する場合

ここでは、行列の掛け算の処理を独立したメソッドとしてカプセル化し、オブジェクト指向プログラミングのスタイルで記述します。

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 2つの行列の積は以下の通りです:");
        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("1つ目の行列:");
        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("2つ目の行列:");
        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);
    }
}

出力

1つ目の行列:
2 3 4
5 2 3
4 6 9
2つ目の行列:
1 5 3
5 6 3
8 1 5

2つの行列の積は以下の通りです:
49 32 35
39 40 36
106 65 75

  1. Javaのsplitメソッドを使ってマトリックス(行列)内の文字列を検索する方法

    Javaのsplitメソッドを活用すると、マトリックス(行列)の中に特定の文字列が存在するかどうかを効率的に判定できます。この記事では、水平方向(行)だけでなく垂直方向(列)にも対応した文字列検索の実装例を紹介します。サンプルコードimport java.util.*; public class Demo {    public static int search_string(String[] my_matrix, String search_string){       for (String input : my_matrix){ &nb

  2. Javaは多次元配列をサポートしている?実態は「配列の配列」

    結論:Javaに真の多次元配列は存在しない 結論から言うと、Javaは厳密な意味での多次元配列をサポートしていません。その代わりにJavaが提供しているのは、「配列の配列(array of arrays)」という仕組みです。 Javaで扱えるのは、あくまで「配列の配列」です。 Javaにおける二次元配列とは、実体としては一次元配列を要素として持つ配列にすぎません。 二次元配列の宣言例 int[][] arr = new int[2][4]; このコードは、長さ4のint型一次元配列への参照を2つ持つ配列を生成します。見た目上は2行4列の表のように扱えますが、内部的には独立した配列が入れ子