Ссылка на объект не указывает на экземпляр обьекта - C#

Узнай цену своей работы

Формулировка задачи:

Привет всем! Пишу программу для диплома - нейронную сеть неокогнитрон. Точнее, уже написал. Но, наверно, ни у кого сразу не получается написать объемную прогу без ошибок. Вот и у меня они есть Одна из них в сабже. Объясню. Я создал для выходов всех нейронов сети и их синапсов двумерные массивы двумерных массивов(на 4 слоях по 30 плоскостей простых, сложных, тормозящих и латерально-тормозящих нейронов на каждом слое). На каждом слое массивы разных размерностей(так как с каждым слоем кол-во нейронов уменьшается). То есть, sOut[1, 0][8, 8], sOut[2, 0][6, 6] и т.д. Массивы проинициализировал нулями. И вот что мне выдает. Показываю коды. Объявление всего:
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(); // ЗДЕСЬ ПОДСВЕЧИВАЕТ!!!
                }
Указывает на cbSynapses. Пишет, что равно null. И так со всеми объявленными и проинициализированными массивами. Получается, я неверно проинициализировал? Я изначально грешил на массивы плоскостей(объекты классов) splanes, cplanes, ... Но нет, с ними вроде все в порядке. Вот, к примеру, конструктор C- плоскости:
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, ...

Оцени полезность:

12   голосов , оценка 4.5 из 5
Похожие ответы