Ссылка на объект не указывает на экземпляр обьекта - 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, ...
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д