任意の行数列数の正方行列の掛け算の値を求めるプログラム例
ここでは配列を行列に見立てて計算を行うが特に行列の掛け算を行う関数が受け取る引数について注目してもらいたい。
import java.io.*;
class Co
{
static final int N=3;
}
class Matrixmultiply
{
public static void main()
{
int i,j;
double A[][]={{0.0,1.0,2.0},{1.0,2.0,3.0},{2.0,3.0,4.0}};
double B[][]={{0.0,1.0,2.0},{1.0,2.0,3.0},{2.0,3.0,4.0}};
double C[][]={{0.0,0.0,0.0},{0.0,0.0,0.0},{0.0,0.0,0.0}};
Matrixmultiply f=new Matrixmultiply();
f.mm(A,B,C);
for(i=0;i<Co.N;i++)
{
for(j=0;j<Co.N;j++)
{
System.out.print( + C[i][j] + " " );
}
System.out.println();
}
}
void mm(double A[][],double B[][],double C[][])
{
int i,j,k;
for(i=0;i<Co.N;i++)
{
for(j=0;j<Co.N;j++)
{
for(k=0;k<Co.N;k++)
{
C[i][j]+=A[i][k]*B[k][j];
}
}
}
}
}
結果は次のようになる。
5.0 8.0 11.0
8.0 14.0 20.0
11.0 20.0 29.0
Press any key to continue
確かに計算結果は正しい。
ここで行列の掛け算を行う関数が特に値を返してもなく、計算結果を格納する配列 C に計算結果が代入されていることに注意したい。普通の整数等の変数を関数が受け取ってその関数内でその変数に代入等しても、元々の変数は影響を受けない。これは、このときは関数が変数を受け取ったときに、新たな変数を格納する場所をメモリーに作るからである。
しかし、配列を関数に渡す場合は、その配列が存在するメモリーの位置としての情報を関数に渡すのである。よって、当然関数内で受け取った配列を操作すれば、操作した後の情報がそのメモリーの位置に上書きされるので元々の配列の情報は失われる。よって関数に配列を渡すときは注意しておこう。