メソッド使用部分ではなく定義部分では
定義部分に引数が記述された時点で記述された引数が宣言されるような作りになっていて
この変数を「仮引数」と言います
メソッド定義部分である
void KullbackLeiblerdivergence(double a0[0],double a1[0],double a2[0],double a0[1],double a1[1],double a2[1]){
で用いられているa0[0],a2[1]などの変数は
仮変数を宣言する以前に
double[] a0=new double[2];
double[] a1=new double[2];
double[] a2=new double[2];
を書いてa0,a1,a2の配列の範囲を確保しておかなければ使えないので
(?確保?宣言または同時に行う)、
書かれたプログラム内ではまず
void KullbackLeiblerdivergence(double a0[0],double a1[0],double a2[0],double a0[1],double a1[1],double a2[1]){
として仮変数を宣言し使用した「後」にメソッド内で
double[] a0=new double[2];
double[] a1=new double[2];
double[] a2=new double[2];
として仮変数の配列変数としての範囲を確保していて
順番が逆なのでプログラムは動かず、
double型の値一つが入る仮引数6つが入ったこのメソッドを動かしたければ
void KullbackLeiblerdivergence(double a,double b,double c,double d,double e,double f){
のように確保の記述なしで宣言と同時に使用できるようになる変数を用いる必要があります
引数に配列変数を用いたい場合は
void KullbackLeiblerdivergence(double a[],double b[],double c[],double d[],double e[],double f[]){
などのように書くと呼び出し側で入れた一つ一つの配列変数の位置を示す値が代入されるので
この場合も配列に添字をつける必要はありません
この場合も配列に添字をつけるとエラーが出ます
下記のプログラムを1つのファイルでDG.javaとしてコンパイルして実行すると動作
public class DG{
public static void main(String[] args){
Dpd s=new Dpd();
double[] a0={0.1,1.2};
double[] a1={2.3,4.5};
double[] a2={6.7,8.9};
s. KullbackLeiblerdivergence(a0[0],a1[0],a2[0],a0[1],a1[1],a2[1]);//実引数6つ用いてメソッドを呼び出す
}
}
class Dpd{
void KullbackLeiblerdivergence(double b0,double c0,double d0,double b1,double c1,double d1){//仮引数6つ宣言
double[] a0=new double[2];
double[] a1=new double[2];
double[] a2=new double[2];
a0[0]=b0;
a1[0]=c0;
a2[0]=d0;
a0[1]=b1;
a1[1]=c1;
a2[1]=d1;
double KL=a0[0]*Math.log(a0[0]/a0[1])+a1[0]*Math.log(a1[0]/a1[1])+a2[0]*Math.log(a2[0]/a2[1]);
System.out.println("PとQの間のカルバック・ライブラー・ダイバージェンスは"+KL+"です。");
}
}