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

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

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

Привет всем! Пишу программу для диплома - нейронную сеть неокогнитрон. Точнее, уже написал. Но, наверно, ни у кого сразу не получается написать объемную прогу без ошибок. Вот и у меня они есть Одна из них в сабже. Объясню. Я создал для выходов всех нейронов сети и их синапсов двумерные массивы двумерных массивов(на 4 слоях по 30 плоскостей простых, сложных, тормозящих и латерально-тормозящих нейронов на каждом слое). На каждом слое массивы разных размерностей(так как с каждым слоем кол-во нейронов уменьшается). То есть, sOut[1, 0][8, 8], sOut[2, 0][6, 6] и т.д. Массивы проинициализировал нулями. И вот что мне выдает. Показываю коды. Объявление всего:
Листинг программы
  1. public partial class Form1 : Form
  2. {
  3. Bitmap image;
  4. public double[,] pixels; // Двумерный массив пикселей изображения
  5. public double[,] inputSynapses; // Массив синапсов, идущих от пикселей
  6. public double[,][,] sOutputs; // Массивы выходов S-, C-, B-, L- нейронов
  7. public double[,][,] lOutputs;
  8. public double[,][,] cOutputs;
  9. public double[,][,] bOutputs;
  10. public double[,][,] slSynapses; // Массивы синапсов от S- к L- нейронам, от L- к C-, от C- к B-, от C- к S-, от B- к S-
  11. public double[,][,] lcSynapses;
  12. public double[,][,] cbSynapses;
  13. public double[,][,] csSynapses;
  14. public double[,][,] bsSynapses;
  15. public double[] selectivity;
  16. public double q = 10; // Коэффициент обучения
  17. public int layers = 4; // Количество слоев
  18. public int epochs = 50; // Количество эпох
  19. public int i, j; // Переменные для счетчиков
  20. public int k, l;
  21. public double winner_neuron = 0.0;
  22. public int winner_plane = 0; // Номер плоскости C- нейрона-победителя в последнем слое
Инициализация массивов:
Листинг программы
  1. 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) // Инициализация массивов выходов всех нейронов и массивов синапсов
  2. {
  3. inpSyn = new double[12, 12];
  4. sOut = new double[4, 30][,];
  5. lOut = new double[4, 30][,];
  6. cOut = new double[4, 30][,];
  7. bOut = new double[4, 30][,];
  8. slSyn = new double[4, 30][,];
  9. cbSyn = new double[3, 30][,];
  10. csSyn = new double[3, 30][,];
  11. selectiv = new double[4];
  12. lcSyn = new double[4, 30][,];
  13. bsSyn = new double[3, 30][,];
  14. double var = 0.1;
  15. double var1 = 0.1;
  16. for (i = 0; i < layers; i++)
  17. for (j = 0; j < 30; j++)
  18. {
  19. if (i == 0)
  20. {
  21. sOut[i, j] = new double[8, 8];
  22. lOut[i, j] = new double[8, 8];
  23. cOut[i, j] = new double[7, 7];
  24. bOut[i, j] = new double[7, 7];
  25. slSyn[i, j] = new double[8, 8];
  26. cbSyn[i, j] = new double[7, 7];
  27. lcSyn[i, j] = new double[8, 8];
  28. csSyn[i, j] = new double[7, 7];
  29. bsSyn[i, j] = new double[7, 7];
  30. }
  31. else if (i == 1)
  32. {
  33. sOut[i, j] = new double[6, 6];
  34. lOut[i, j] = new double[6, 6];
  35. cOut[i, j] = new double[5, 5];
  36. bOut[i, j] = new double[5, 5];
  37. slSyn[i, j] = new double[6, 6];
  38. cbSyn[i, j] = new double[5, 5];
  39. lcSyn[i, j] = new double[6, 6];
  40. csSyn[i, j] = new double[5, 5];
  41. bsSyn[i, j] = new double[5, 5];
  42. }
  43. else if (i == 2)
  44. {
  45. sOut[i, j] = new double[4, 4];
  46. lOut[i, j] = new double[4, 4];
  47. cOut[i, j] = new double[3, 3];
  48. bOut[i, j] = new double[3, 3];
  49. slSyn[i, j] = new double[4, 4];
  50. cbSyn[i, j] = new double[3, 3];
  51. lcSyn[i, j] = new double[4, 4];
  52. csSyn[i, j] = new double[3, 3];
  53. bsSyn[i, j] = new double[3, 3];
  54. }
  55. else if (i == 3)
  56. {
  57. sOut[i, j] = new double[2, 2];
  58. lOut[i, j] = new double[2, 2];
  59. cOut[i, j] = new double[1, 1];
  60. slSyn[i, j] = new double[2, 2];
  61. lcSyn[i, j] = new double[2, 2];
  62. }
  63. }
  64. for(i = 0; i < 12;i++)
  65. for(j = 0;j < 12;j++)
  66. inpSyn[i, j] = 0;
  67. for(i = 0;i < (layers - 1);i++)
  68. for(j = 0;j < 30;j++){
  69. for(k = 0;k < sOut[i, j].GetLength(0);k++)
  70. for(l = 0;l < sOut[i, j].GetLength(1);l++)
  71. sOut[i, j][k, l] = 0;
  72. for(k = 0;k < lOut[i, j].GetLength(0);k++)
  73. for (l = 0; l < lOut[i, j].GetLength(1); l++)
  74. lOut[i, j][k, l] = 0;
  75. for (k = 0; k < cOut[i, j].GetLength(0); k++)
  76. for (l = 0; l < cOut[i, j].GetLength(1); l++)
  77. cOut[i, j][k, l] = 0;
  78. for (k = 0; k < bOut[i, j].GetLength(0); k++)
  79. for (l = 0; l < bOut[i, j].GetLength(1); l++)
  80. bOut[i, j][k, l] = 0;
  81. for (k = 0; k < slSyn[i, j].GetLength(0); k++)
  82. for (l = 0; l < slSyn[i, j].GetLength(1); l++)
  83. slSyn[i, j][k, l] = 0;
  84. for (k = 0; k < cbSyn[i, j].GetLength(0); k++)
  85. for (l = 0; l < cbSyn[i, j].GetLength(1); l++)
  86. cbSyn[i, j][k, l] = 0;
  87. for (k = 0; k < csSyn[i, j].GetLength(0); k++)
  88. for (l = 0; l < csSyn[i, j].GetLength(1); l++)
  89. csSyn[i, j][k, l] = 0;
  90. for (k = 0; k < lcSyn[i, j].GetLength(0); k++)
  91. for (l = 0; l < lcSyn[i, j].GetLength(1); l++)
  92. {
  93. lcSyn[i, j][k, l] = var1;
  94. var1 += 0.1;
  95. }
  96. for (k = 0; k < bsSyn[i, j].GetLength(0); k++)
  97. for (l = 0; l < bsSyn[i, j].GetLength(1); l++)
  98. bsSyn[i, j][k, l] = 0;
  99. var1 = 0.1;
  100. }
  101. for(j = 0;j < 30;j++){
  102. for(k = 0;k < 2;k++)
  103. for(l = 0;l < 2;l++){
  104. sOut[3, j][k, l] = 0;
  105. lOut[3, j][k, l] = 0;
  106. slSyn[3, j][k, l] = 0;
  107. lcSyn[3, j][k, l] = var1;
  108. var1 += 0.1;
  109. }
  110. cOut[3, j][0, 0] = 0;
  111. var1 = 0.1;
  112. }
  113. for(i = 0;i < 4;i++){
  114. selectiv[i] = var;
  115. var += 0.1;
  116. }
  117. }
Вот в этом участке кода выдает ошибку:
Листинг программы
  1. public void Neocognitron() // Реализация неокогнитрона
  2. {
  3. Simple[,] splanes;
  4. Complex[,] cplanes;
  5. Brake[,] bplanes;
  6. Lateral[,] lplanes;
  7. splanes = new Simple[4, 30];
  8. cplanes = new Complex[4, 30];
  9. bplanes = new Brake[3, 30];
  10. lplanes = new Lateral[4, 30];
  11. for (i = 0; i < layers; i++)
  12. for (j = 0; j < 30; j++)
  13. {
  14. if (i == 0)
  15. {
  16. splanes[i, j] = new Simple(8, 8, 5, 5);
  17. cplanes[i, j] = new Complex(7, 7, 2, 2);
  18. bplanes[i, j] = new Brake(7, 7);
  19. lplanes[i, j] = new Lateral(8, 8);
  20. }
  21. else if (i == 1)
  22. {
  23. splanes[i, j] = new Simple(6, 6, 2, 2);
  24. cplanes[i, j] = new Complex(5, 5, 2, 2);
  25. bplanes[i, j] = new Brake(5, 5);
  26. lplanes[i, j] = new Lateral(6, 6);
  27. }
  28. else if (i == 2)
  29. {
  30. splanes[i, j] = new Simple(4, 4, 2, 2);
  31. cplanes[i, j] = new Complex(3, 3, 2, 2);
  32. bplanes[i, j] = new Brake(3, 3);
  33. lplanes[i, j] = new Lateral(4, 4);
  34. }
  35. else if (i == 3)
  36. {
  37. splanes[i, j] = new Simple(2, 2, 2, 2);
  38. cplanes[i, j] = new Complex(1, 1, 2, 2);
  39. lplanes[i, j] = new Lateral(2, 2);
  40. }
  41. }
  42. init(inputSynapses, sOutputs, lOutputs, cOutputs, bOutputs, slSynapses, cbSynapses, selectivity, lcSynapses, csSynapses, bsSynapses);
  43. for (i = 0; i < layers; i++)
  44. for (j = 0; j < 30; j++)
  45. {
  46. if (i == 0)
  47. splanes[i, j].setLSynapses(0.04);
  48. else
  49. splanes[i, j].setLSynapses(0.25);
  50. cplanes[i, j].setCBSynapses(0.25);
  51. }
  52. for (i = 0; i < layers; i++)
  53. for (j = 0; j < 30; j++)
  54. {
  55. slSynapses[i, j] = splanes[i, j].getLSynapses();
  56. cbSynapses[i, j] = cplanes[i, j].getCBSynapses(); // ЗДЕСЬ ПОДСВЕЧИВАЕТ!!!
  57. }
Указывает на cbSynapses. Пишет, что равно null. И так со всеми объявленными и проинициализированными массивами. Получается, я неверно проинициализировал? Я изначально грешил на массивы плоскостей(объекты классов) splanes, cplanes, ... Но нет, с ними вроде все в порядке. Вот, к примеру, конструктор C- плоскости:
Листинг программы
  1. class Complex : Plane
  2. {
  3. private CNeuron[,] cNeurons;
  4. private double[,] CBSynapses;
  5. private double[,] CSSynapses;
  6. private double[,] COutputs;
  7. private int n, m;
  8. private int a, b;
  9. public Complex(int nn, int mm, int aa, int bb)
  10. {
  11. n = nn;
  12. m = mm;
  13. a = aa;
  14. b = bb;
  15. cNeurons = new CNeuron[n, m];
  16. CBSynapses = new double[n, m];
  17. CSSynapses = new double[n, m];
  18. COutputs = new double[n, m];
  19. for (int i = 0; i < n; i++)
  20. for (int j = 0; j < m; j++)
  21. {
  22. cNeurons[i, j] = new CNeuron(a, b);
  23. CBSynapses[i, j] = 0;
  24. CSSynapses[i, j] = 0;
  25. COutputs[i, j] = 0;
  26. }
  27. }
Понимаю, что много написал...но помогите, пожалуйста. Сижу полночи уже, не могу понять, где ошибся.

Решение задачи: «Ссылка на объект не указывает на экземпляр обьекта»

textual
Листинг программы
  1. public void init(double[,] inpSyn, out double[,][,] sOut, ...

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

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

12   голосов , оценка 4.5 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы