Ошибка OutOfMemoryException при создании матрицы - C#
Формулировка задачи:
Пытаюсь создать матрицу
Выдает ошибку "Выдано исключение типа "System.OutOfMemoryException"."
что это и как с этим можно боротся?
Листинг программы
- maxi = 14357
- maxj = 2515
- double[,] res = new double[maxi, maxj];
Решение задачи: «Ошибка 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;
- }
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д