toop_project.src.Matrix.DiagonalMatrix.LSolve C# (CSharp) Method

LSolve() public method

public LSolve ( Vector x, bool UseDiagonal ) : Vector
x toop_project.src.Vector_.Vector
UseDiagonal bool
return toop_project.src.Vector_.Vector
        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("Диагональный формат: Несовпадение размерностей матрицы и вектора в прямом ходе");
        }