Javaによる行列の積の計算
行列は大学数学の線形代数で出てきます。
行列は物理学や、情報理論などの専門分野でよく使います。
プログラミング言語のJavaで行列の積の計算を行うプログラムを作成しました。
行列A :(m×n)行列
行列B :(n×p) 行列
C = A×B とすると、行列Cは(m×p)行列になります。
プログラムのソースコードを以下に示します。
import java.io.*;
class Matrix_product
{
public static void main(String args[]) throws IOException
{
BufferedReader br =
new BufferedReader(new InputStreamReader(System.in));
System.out.println("「mxn行列A」と「nxp行列B」の積「mxp行列C」を計算します");
System.out.print("m:");
String str = br.readLine();
int m = Integer.parseInt(str);
System.out.print("n:");
str = br.readLine();
int n = Integer.parseInt(str);
System.out.print("p:");
str = br.readLine();
int p = Integer.parseInt(str);
int[][] A = new int[m][n];
int[][] B = new int[n][p];
int[][] C = new int[m][p];
System.out.println("");
int i,j,k;
System.out.println(m + "×" + n + "行列Aを作成します");
for(i=0; i < m; i++)
{
for(j=0; j < n; j++)
{
System.out.print("(" + (i+1) + "," + (j+1) + ")" + "成分:");
str = br.readLine();
A[i][j] = Integer.parseInt(str);
}
}
System.out.println("");
System.out.println(m + "×" + n + "行列Aを表示します");
for(i=0; i < m; i++)
{
for(j=0; j < n; j++)
{
System.out.print(A[i][j] + "\t");
}
System.out.println("");
}
System.out.println("");
System.out.println(n + "×" + p + "行列Bを作成します");
for(i=0; i < n; i++)
{
for(j=0; j < p; j++)
{
System.out.print("(" + (i+1) + "," + (j+1) + ")" + "成分:");
str = br.readLine();
B[i][j] = Integer.parseInt(str);
}
}
System.out.println("");
System.out.println(n + "×" + p + "行列Bを表示します");
for(i=0; i < n; i++)
{
for(j=0; j < p; j++)
{
System.out.print(B[i][j] + "\t");
}
System.out.println("");
}
System.out.println("");
System.out.println(m + "×" + p + "行列Cを表示します");
for(i=0; i < m; i++)
{
for(j=0; j < p; j++)
{
for(k=0; k < n; k++)
{
C[i][j] += A[i][k] * B[k][j];
}
System.out.print(C[i][j] + "\t");
}
System.out.println("");
}
}
}
プログラムの流れを説明をします。
まず、行列のサイズを表す変数m, n, p の値を入力します。
すると、行列AとBの型が決まるので、それぞれの行列の成分( i , j )の値を2重for文を使って入力します。確認のため、入力した結果を行列に似た形式で表示させます。
そして、3重for文を使って、行列AとBの積を行列Cに代入します。以下の式を参考にしました。
プログラムを実行した結果は以下の通りです。
「mxn行列A」と「nxp行列B」の積「mxp行列C」を計算します
m:2
n:3
p:2
2×3行列Aを作成します
(1,1)成分:2
(1,2)成分:0
(1,3)成分:-4
(2,1)成分:-3
(2,2)成分:1
(2,3)成分:2
2×3行列Aを表示します
2 0 -4
-3 1 2
3×2行列Bを作成します
(1,1)成分:5
(1,2)成分:7
(2,1)成分:0
(2,2)成分:3
(3,1)成分:-1
(3,2)成分:4
3×2行列Bを表示します
5 7
0 3
-1 4
2×2行列Cを表示します
14 -2
-17 -10
行列の型と各々の成分の値を入力する側で決めることができるので、柔軟なプログラムであると自負しています。
その点で、Javaは配列の要素数の部分に変数が使えるので便利です。C言語では、要素数に変数が使えないので、このようなプログラムを作るのは、なかなか厳しいと思います。
ご覧いただきありがとうございました。