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

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

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

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

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

textual
Листинг программы
// Сжатие
public static double[,] zipMatrix(double[,] A)
        {
            List<int> indx = new List<int>();
            List<int> jndx = new List<int>();
            List<double> val = new List<double>();
            for (int i = 0; i < A.GetLength(0); i++)
            {
                for (int j = 0; j < A.GetLength(1); j++)
                {
                    if(A[i,j]!=0){
                        indx.Add(i+1);
                        jndx.Add(j+1);
                        val.Add(A[i,j]);
                    }
                    
                }
            }
 
            int[] indxI = indx.ToArray();
            int[] indxJ = jndx.ToArray();
            double[] val2 = val.ToArray();
            double[,] res = new double[indxI.Length, 3];
 
            for (int i = 0; i < indxI.Length; i++)
            {
                res[i, 0] = indxI[i];
                res[i, 1] = indxJ[i];
                res[i, 2] = val2[i];
            }
 
            return res;
        }
// Умноже сжатых матриц
// Правда тут из за того что изначально нужно знать размеры результирующей матрицы, то присувствуют два лишних цикла по нахождению максимума в пеивом столбцу первой матрицы(что равно количеству строк в результирующей) и максимальное значение со второго столбца второй матрицы(что равно количеству столбцов результирующей). И это при больших матрицах отнимает слишком много драгоценного времени. У меня примерно 35 секунд, и сейчас я думаю как это можно оптимизировать. но ничего придумать не могу, если у кого нибуть будут какие идеи буду рад усоышать 
public static double[,] multiZipMatrix(double[,] A, double[,] B,bool q) 
        {
            //q = true значит получить zip matrix
            int maxi = 0;
            
            for (int i = 0; i < A.GetLength(0); i++)
                if (A[i, 0] > maxi) maxi = (int)A[i, 0];
 
            int maxj = 0;
            for (int i = 0; i < B.GetLength(0); i++)
                if (B[i, 1] > maxj) maxj = (int)B[i, 1];
            double[,] res = new double[maxi, maxj];
            for (int i = 0; i < A.GetLength(0); i++)
            {
                for (int j = 0; j < B.GetLength(0); j++)
                {
                    if (A[i, 1] == B[j, 0])
                    {
                        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];
                    }
                }
            }
            if (q)
            {
                double[,] res2 = zipMatrix(res);
                return res2;
            }
            else
            {
                return res;
            }
            
        }

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


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

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

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