struct NEURON { double output, old_output; double thres; int Ninp; double *inp_wgt; struct NEURON **inp_neuron; }; typedef struct NEURON neuron;
Ninp
という int
型の変数を加えました。このニューロンが
いくつのニューロンからの入力を受けるかを表します。加えて、
struct NEURON **inp_neuron;
というこのニューロンに対して出力を送っている
ニューロンへのポインタを格納するためのポインタ(配列)を用意しておきます。
一つのニューロンを初期化する関数内では
void initialize_neuron(neuron *a, int N) { int i; a->Ninp = N; a->inp_wgt = (double *)malloc(sizeof(double) * (N+1)); for (i=0; i<=N; i++) { a->inp_wgt[i] = drand2(); } a->inp_neuron = (neuron **)malloc(sizeof(neuron *) * (N+1)); }
malloc()
関数を使って確保することにします。
このようにしておくと、ニューロン数がいくつになっても対応できます。
ポインタへのポインタと、メモリの動的割り当て(malloc()
)と、定義済変数のサイズを
計算するための sizeof
などすこし分かりづらいかも知れませんが、この方が
拡張性が高いといえます。このようにしておけば、ニューロン a
とニューロンb
との相互結合を次のように表現できます。
Neuron a,b; initialize_neuron(&a, 2); initialize_neuron(&b, 2); a.inp_neuron[1] = &b; b.inp_neuron[1] = &a;