Ссылка на объект не указывает на экземпляр обьекта - C#
Формулировка задачи:
Привет всем!
Пишу программу для диплома - нейронную сеть неокогнитрон. Точнее, уже написал. Но, наверно, ни у кого сразу не получается написать объемную прогу без ошибок. Вот и у меня они есть
Одна из них в сабже. Объясню. Я создал для выходов всех нейронов сети и их синапсов двумерные массивы двумерных массивов(на 4 слоях по 30 плоскостей простых, сложных, тормозящих и латерально-тормозящих нейронов на каждом слое). На каждом слое массивы разных размерностей(так как с каждым слоем кол-во нейронов уменьшается). То есть, sOut[1, 0][8, 8], sOut[2, 0][6, 6] и т.д. Массивы проинициализировал нулями.
И вот что мне выдает. Показываю коды.
Объявление всего:
Инициализация массивов:
Вот в этом участке кода выдает ошибку:
Указывает на cbSynapses. Пишет, что равно null. И так со всеми объявленными и проинициализированными массивами. Получается, я неверно проинициализировал? Я изначально грешил на массивы плоскостей(объекты классов) splanes, cplanes, ... Но нет, с ними вроде все в порядке.
Вот, к примеру, конструктор C- плоскости:
public partial class Form1 : Form { Bitmap image; public double[,] pixels; // Двумерный массив пикселей изображения public double[,] inputSynapses; // Массив синапсов, идущих от пикселей public double[,][,] sOutputs; // Массивы выходов S-, C-, B-, L- нейронов public double[,][,] lOutputs; public double[,][,] cOutputs; public double[,][,] bOutputs; public double[,][,] slSynapses; // Массивы синапсов от S- к L- нейронам, от L- к C-, от C- к B-, от C- к S-, от B- к S- public double[,][,] lcSynapses; public double[,][,] cbSynapses; public double[,][,] csSynapses; public double[,][,] bsSynapses; public double[] selectivity; public double q = 10; // Коэффициент обучения public int layers = 4; // Количество слоев public int epochs = 50; // Количество эпох public int i, j; // Переменные для счетчиков public int k, l; public double winner_neuron = 0.0; public int winner_plane = 0; // Номер плоскости C- нейрона-победителя в последнем слое
public void init(double[,] inpSyn, double[,][,] sOut, double[,][,] lOut, double[,][,] cOut, double[,][,] bOut, double[,][,] slSyn, double[,][,] cbSyn, double[] selectiv, double[,][,] lcSyn, double[,][,] csSyn, double[,][,] bsSyn) // Инициализация массивов выходов всех нейронов и массивов синапсов { inpSyn = new double[12, 12]; sOut = new double[4, 30][,]; lOut = new double[4, 30][,]; cOut = new double[4, 30][,]; bOut = new double[4, 30][,]; slSyn = new double[4, 30][,]; cbSyn = new double[3, 30][,]; csSyn = new double[3, 30][,]; selectiv = new double[4]; lcSyn = new double[4, 30][,]; bsSyn = new double[3, 30][,]; double var = 0.1; double var1 = 0.1; for (i = 0; i < layers; i++) for (j = 0; j < 30; j++) { if (i == 0) { sOut[i, j] = new double[8, 8]; lOut[i, j] = new double[8, 8]; cOut[i, j] = new double[7, 7]; bOut[i, j] = new double[7, 7]; slSyn[i, j] = new double[8, 8]; cbSyn[i, j] = new double[7, 7]; lcSyn[i, j] = new double[8, 8]; csSyn[i, j] = new double[7, 7]; bsSyn[i, j] = new double[7, 7]; } else if (i == 1) { sOut[i, j] = new double[6, 6]; lOut[i, j] = new double[6, 6]; cOut[i, j] = new double[5, 5]; bOut[i, j] = new double[5, 5]; slSyn[i, j] = new double[6, 6]; cbSyn[i, j] = new double[5, 5]; lcSyn[i, j] = new double[6, 6]; csSyn[i, j] = new double[5, 5]; bsSyn[i, j] = new double[5, 5]; } else if (i == 2) { sOut[i, j] = new double[4, 4]; lOut[i, j] = new double[4, 4]; cOut[i, j] = new double[3, 3]; bOut[i, j] = new double[3, 3]; slSyn[i, j] = new double[4, 4]; cbSyn[i, j] = new double[3, 3]; lcSyn[i, j] = new double[4, 4]; csSyn[i, j] = new double[3, 3]; bsSyn[i, j] = new double[3, 3]; } else if (i == 3) { sOut[i, j] = new double[2, 2]; lOut[i, j] = new double[2, 2]; cOut[i, j] = new double[1, 1]; slSyn[i, j] = new double[2, 2]; lcSyn[i, j] = new double[2, 2]; } } for(i = 0; i < 12;i++) for(j = 0;j < 12;j++) inpSyn[i, j] = 0; for(i = 0;i < (layers - 1);i++) for(j = 0;j < 30;j++){ for(k = 0;k < sOut[i, j].GetLength(0);k++) for(l = 0;l < sOut[i, j].GetLength(1);l++) sOut[i, j][k, l] = 0; for(k = 0;k < lOut[i, j].GetLength(0);k++) for (l = 0; l < lOut[i, j].GetLength(1); l++) lOut[i, j][k, l] = 0; for (k = 0; k < cOut[i, j].GetLength(0); k++) for (l = 0; l < cOut[i, j].GetLength(1); l++) cOut[i, j][k, l] = 0; for (k = 0; k < bOut[i, j].GetLength(0); k++) for (l = 0; l < bOut[i, j].GetLength(1); l++) bOut[i, j][k, l] = 0; for (k = 0; k < slSyn[i, j].GetLength(0); k++) for (l = 0; l < slSyn[i, j].GetLength(1); l++) slSyn[i, j][k, l] = 0; for (k = 0; k < cbSyn[i, j].GetLength(0); k++) for (l = 0; l < cbSyn[i, j].GetLength(1); l++) cbSyn[i, j][k, l] = 0; for (k = 0; k < csSyn[i, j].GetLength(0); k++) for (l = 0; l < csSyn[i, j].GetLength(1); l++) csSyn[i, j][k, l] = 0; for (k = 0; k < lcSyn[i, j].GetLength(0); k++) for (l = 0; l < lcSyn[i, j].GetLength(1); l++) { lcSyn[i, j][k, l] = var1; var1 += 0.1; } for (k = 0; k < bsSyn[i, j].GetLength(0); k++) for (l = 0; l < bsSyn[i, j].GetLength(1); l++) bsSyn[i, j][k, l] = 0; var1 = 0.1; } for(j = 0;j < 30;j++){ for(k = 0;k < 2;k++) for(l = 0;l < 2;l++){ sOut[3, j][k, l] = 0; lOut[3, j][k, l] = 0; slSyn[3, j][k, l] = 0; lcSyn[3, j][k, l] = var1; var1 += 0.1; } cOut[3, j][0, 0] = 0; var1 = 0.1; } for(i = 0;i < 4;i++){ selectiv[i] = var; var += 0.1; } }
public void Neocognitron() // Реализация неокогнитрона { Simple[,] splanes; Complex[,] cplanes; Brake[,] bplanes; Lateral[,] lplanes; splanes = new Simple[4, 30]; cplanes = new Complex[4, 30]; bplanes = new Brake[3, 30]; lplanes = new Lateral[4, 30]; for (i = 0; i < layers; i++) for (j = 0; j < 30; j++) { if (i == 0) { splanes[i, j] = new Simple(8, 8, 5, 5); cplanes[i, j] = new Complex(7, 7, 2, 2); bplanes[i, j] = new Brake(7, 7); lplanes[i, j] = new Lateral(8, 8); } else if (i == 1) { splanes[i, j] = new Simple(6, 6, 2, 2); cplanes[i, j] = new Complex(5, 5, 2, 2); bplanes[i, j] = new Brake(5, 5); lplanes[i, j] = new Lateral(6, 6); } else if (i == 2) { splanes[i, j] = new Simple(4, 4, 2, 2); cplanes[i, j] = new Complex(3, 3, 2, 2); bplanes[i, j] = new Brake(3, 3); lplanes[i, j] = new Lateral(4, 4); } else if (i == 3) { splanes[i, j] = new Simple(2, 2, 2, 2); cplanes[i, j] = new Complex(1, 1, 2, 2); lplanes[i, j] = new Lateral(2, 2); } } init(inputSynapses, sOutputs, lOutputs, cOutputs, bOutputs, slSynapses, cbSynapses, selectivity, lcSynapses, csSynapses, bsSynapses); for (i = 0; i < layers; i++) for (j = 0; j < 30; j++) { if (i == 0) splanes[i, j].setLSynapses(0.04); else splanes[i, j].setLSynapses(0.25); cplanes[i, j].setCBSynapses(0.25); } for (i = 0; i < layers; i++) for (j = 0; j < 30; j++) { slSynapses[i, j] = splanes[i, j].getLSynapses(); cbSynapses[i, j] = cplanes[i, j].getCBSynapses(); // ЗДЕСЬ ПОДСВЕЧИВАЕТ!!! }
class Complex : Plane { private CNeuron[,] cNeurons; private double[,] CBSynapses; private double[,] CSSynapses; private double[,] COutputs; private int n, m; private int a, b; public Complex(int nn, int mm, int aa, int bb) { n = nn; m = mm; a = aa; b = bb; cNeurons = new CNeuron[n, m]; CBSynapses = new double[n, m]; CSSynapses = new double[n, m]; COutputs = new double[n, m]; for (int i = 0; i < n; i++) for (int j = 0; j < m; j++) { cNeurons[i, j] = new CNeuron(a, b); CBSynapses[i, j] = 0; CSSynapses[i, j] = 0; COutputs[i, j] = 0; } }
Понимаю, что много написал...но помогите, пожалуйста. Сижу полночи уже, не могу понять, где ошибся.
Решение задачи: «Ссылка на объект не указывает на экземпляр обьекта»
textual
Листинг программы
public void init(double[,] inpSyn, out double[,][,] sOut, ...
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д