Ошибка OutOfMemoryException при создании матрицы - C#

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

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

Пытаюсь создать матрицу
Листинг программы
  1. maxi = 14357
  2. maxj = 2515
  3. double[,] res = new double[maxi, maxj];
Выдает ошибку "Выдано исключение типа "System.OutOfMemoryException"." что это и как с этим можно боротся?

Решение задачи: «Ошибка OutOfMemoryException при создании матрицы»

textual
Листинг программы
  1. // Сжатие
  2. public static double[,] zipMatrix(double[,] A)
  3.         {
  4.             List<int> indx = new List<int>();
  5.             List<int> jndx = new List<int>();
  6.             List<double> val = new List<double>();
  7.             for (int i = 0; i < A.GetLength(0); i++)
  8.             {
  9.                 for (int j = 0; j < A.GetLength(1); j++)
  10.                 {
  11.                     if(A[i,j]!=0){
  12.                         indx.Add(i+1);
  13.                         jndx.Add(j+1);
  14.                         val.Add(A[i,j]);
  15.                     }
  16.                    
  17.                 }
  18.             }
  19.  
  20.             int[] indxI = indx.ToArray();
  21.             int[] indxJ = jndx.ToArray();
  22.             double[] val2 = val.ToArray();
  23.             double[,] res = new double[indxI.Length, 3];
  24.  
  25.             for (int i = 0; i < indxI.Length; i++)
  26.             {
  27.                 res[i, 0] = indxI[i];
  28.                 res[i, 1] = indxJ[i];
  29.                 res[i, 2] = val2[i];
  30.             }
  31.  
  32.             return res;
  33.         }
  34. // Умноже сжатых матриц
  35. // Правда тут из за того что изначально нужно знать размеры результирующей матрицы, то присувствуют два лишних цикла по нахождению максимума в пеивом столбцу первой матрицы(что равно количеству строк в результирующей) и максимальное значение со второго столбца второй матрицы(что равно количеству столбцов результирующей). И это при больших матрицах отнимает слишком много драгоценного времени. У меня примерно 35 секунд, и сейчас я думаю как это можно оптимизировать. но ничего придумать не могу, если у кого нибуть будут какие идеи буду рад усоышать
  36. public static double[,] multiZipMatrix(double[,] A, double[,] B,bool q)
  37.         {
  38.             //q = true значит получить zip matrix
  39.             int maxi = 0;
  40.            
  41.             for (int i = 0; i < A.GetLength(0); i++)
  42.                 if (A[i, 0] > maxi) maxi = (int)A[i, 0];
  43.  
  44.             int maxj = 0;
  45.             for (int i = 0; i < B.GetLength(0); i++)
  46.                 if (B[i, 1] > maxj) maxj = (int)B[i, 1];
  47.             double[,] res = new double[maxi, maxj];
  48.             for (int i = 0; i < A.GetLength(0); i++)
  49.             {
  50.                 for (int j = 0; j < B.GetLength(0); j++)
  51.                 {
  52.                     if (A[i, 1] == B[j, 0])
  53.                     {
  54.                         res[(int)A[i, 0] - 1, (int)B[j, 1] - 1] = res[(int)A[i, 0] - 1, (int)B[j, 1] - 1] + A[i, 2] * B[j, 2];
  55.                     }
  56.                 }
  57.             }
  58.             if (q)
  59.             {
  60.                 double[,] res2 = zipMatrix(res);
  61.                 return res2;
  62.             }
  63.             else
  64.             {
  65.                 return res;
  66.             }
  67.            
  68.         }

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


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

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

10   голосов , оценка 4.2 из 5

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

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

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