public override Vector LSolve(Vector x, bool UseDiagonal)
{
if (di.Length == x.Size)
{
Vector result = (Vector)x.Clone();
if (UseDiagonal)
{
result[0] /= di[0];
int i;
// Спускаемся, пока не дойдем до последней диагонали
for (i = 1; i < shift_l[0]; i++)
result[i] /= di[i];
for (int k = 0; k < shift_l.Length - 1; k++)
{
for (; i < shift_l[k + 1]; i++)
{
for (int j = k; j >= 0; j--)
result[i] -= al[i][j] * result[i - shift_l[j]];
result[i] /= di[i];
}
}
//Спустились до последней диагонали, обрабатываем все вместе
for (; i < di.Length; i++)
{
for (int j = 0; j < shift_l.Length; j++)
result[i] -= al[i][j] * result[i-shift_l[j]];
result[i] /= di[i];
}
}
else
{
int i = 1;
// Спускаемся, пока не дойдем до последней диагонали
for (int k = 0; k < shift_l.Length; k++)
for (; i < shift_l[k + 1]; i++)
for (int j = k; j >= 0; j--)
result[i] -= al[i][j] * result[i - shift_l[j]];
//Спустились до последней диагонали, обрабатываем все вместе
for (; i < di.Length; i++)
for (int j = 0; j < shift_l.Length; j++)
result[i] -= al[i][j] * result[i - shift_l[j]];
}
return result;
}
else
throw new Exception("Диагональный формат: Несовпадение размерностей матрицы и вектора в прямом ходе");
}