public override Vector UtSolve(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_u[0]; i++)
result[i] /= di[i];
for (int k = 0; k < shift_u.Length - 1; k++)
{
for (; i < shift_u[k + 1]; i++)
{
for (int j = k; j >= 0; j--)
result[i] -= au[i][j] * result[i - shift_u[j]];
result[i] /= di[i];
}
}
//Спустились до последней диагонали, обрабатываем все вместе
for (; i < di.Length; i++)
{
for (int j = 0; j < shift_u.Length; j++)
result[i] -= au[i][j] * result[i - shift_u[j]];
result[i] /= di[i];
}
}
else
{
int i = 1;
// Спускаемся, пока не дойдем до последней диагонали
for (int k = 0; k < shift_u.Length; k++)
for (; i < shift_u[k + 1]; i++)
for (int j = k; j >= 0; j--)
result[i] -= au[i][j] * result[i - shift_u[j]];
//Спустились до последней диагонали, обрабатываем все вместе
for (; i < di.Length; i++)
for (int j = 0; j < shift_u.Length; j++)
result[i] -= au[i][j] * result[i - shift_u[j]];
}
return result;
}
else
throw new Exception("Диагональный формат: Несовпадение размерностей матрицы и вектора в прямом ходе");
}