Ссылка на объект не указывает на экземпляр обьекта - 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, ...