Ошибка 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;
}
}