行列の積を計算するプログラムを作ってみた!(Java)
こんにちは皆さん!さとしです!
初投稿ということで、行列の積の計算を行うプログラムを作ってみました!
プログラミングを学んでいる学生向けに分かりやすく解説していこうと思うので、よろしくお願いいたします。
それではさっそく考えていきましょう!
まずは、このような行列を用意します。
・m×n行列のA ・n×p行列のB
(m,n,pは、任意の定数で表される行と列の数です)
この行列の積ABをCとすると、行列Cはm×p行列となりますね!
まずはこれらの行列の成分をプログラムで宣言する必要があります。
import java.io.*;
class matrix_product
{
public static void main(String[] args)throws IOException
{
System.out.println("m×n行列Aとn×p行列Bの積はm×p行列のCになります。");
System.out.println("m,n,pの値と各行列の要素を入力してください");
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
int m,n,p;
System.out.print("m:");
String str=br.readLine();//mを入力
m=Integer.parseInt(str);
System.out.print("n:");
str=br.readLine();//nを入力
n=Integer.parseInt(str);
System.out.print("p:");
str=br.readLine();//pを入力
p=Integer.parseInt(str);
これはつまり、各行と列の数を表すm,n,pを入力しているということです!
それでは次に行列A、行列Bの各成分の要素を入力してみましょう!
各成分を2次元配列で表しているため、2重for文を使えばいいですね!
ということで、このようになります!
int[][] A=new int[m][n];
int[][] B=new int[n][p];
int[][] C=new int[m][p];
int i,j,k;
for(i=0;i<m;i++){
for(k=0;k<n;k++){
System.out.print("A["+(i+1)+"]["+(k+1)+"]:");
str=br.readLine();//A[i][k]の要素を入力
A[i][k]=Integer.parseInt(str);
}
}
for(k=0;k<n;k++){
for(j=0;j<p;j++){
System.out.print("B["+(k+1)+"]["+(j+1)+"]:");
str=br.readLine();//B[k][j]の要素を入力
B[k][j]=Integer.parseInt(str);
}
}
ここで注意してほしいのが、どの成分の行列の要素を入力するのかと出力している文ですが、全て+1しています。
なぜこんなことをしているのかというと数学的には成分は1から始まります。しかし、Javaでは配列の添え字は0から始まりますね。
そのため、実際に格納する配列成分に+1した数が、数学的な行列と対応するというわけです。
これは私のこだわりなので、真似する必要はありません。
何言っているのかわからないという方は飛ばしていただいて問題ありません(笑)
あと、for文内で使っている文字をiとk、kとjにしているのは、後々考えるときに分かりやすいためこのようにしているだけです。
さてさて問題に戻りましょう!
いよいよ要素同士の計算を行っていきます!
まず、行列の計算の定義としてこのようなものがあります。
C[i][j]=Σ(k=1,n)A[i][k]×B[k][j]
これは行列Cのi×j成分の要素を求めるための式です。
これを全成分求めればよいので、3重for文を使います!
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];//C[i][j]成分の要素を求める式
}
}
これは公式に代入しているだけなので問題ありませんね。
最後に、再度for文を使って行列Cを出力すれば完成です!
それでは、完成したソースコードを見てみましょう!
import java.io.*;
class matrix_product
{
public static void main(String[] args)throws IOException
{
System.out.println("m×n行列Aとn×p行列Bの積はm×p行列のCになります。");
System.out.println("m,n,pの値と各行列の要素を入力してください");
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
int m,n,p;
System.out.print("m:");
String str=br.readLine();//mを入力
m=Integer.parseInt(str);
System.out.print("n:");
str=br.readLine();//nを入力
n=Integer.parseInt(str);
System.out.print("p:");
str=br.readLine();//pを入力
p=Integer.parseInt(str);
int[][] A=new int[m][n];
int[][] B=new int[n][p];
int[][] C=new int[m][p];
int i,j,k;
for(i=0;i<m;i++){
for(k=0;k<n;k++){
System.out.print("A["+(i+1)+"]["+(k+1)+"]:");
str=br.readLine();//A[i][k]の要素を入力
A[i][k]=Integer.parseInt(str);
}
}
for(k=0;k<n;k++){
for(j=0;j<p;j++){
System.out.print("B["+(k+1)+"]["+(j+1)+"]:");
str=br.readLine();//B[k][j]の要素を入力
B[k][j]=Integer.parseInt(str);
}
}
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];//C[i][j]成分の要素を求める式
}
}
System.out.println("行列C=");
for(i=0;i<m;i++){
for(j=0;j<p;j++)
System.out.print(" "+C[i][j]);
System.out.println();
}
}
}
長いプログラムですが、順々に考えていけば意外と大したことないですね(笑)
ちなみに実行結果はこちら!
A=5 6 B=1 2
7 8 3 4 の行列の積を計算します。
どうでしたか?
これで行列の積の計算するプログラムが分かったのであれば嬉しいです(^▽^)/
最後までお付き合いいただきありがとうございました!
この記事が気に入ったらサポートをしてみませんか?