Clone() public method

public Clone ( ) : object
return object
示例#1
0
        public override Vector UtSolve(Vector x, bool UseDiagonal)
        {
            if (n == x.Size)
            {

                Vector result = (Vector)x.Clone();
                if (UseDiagonal)
                {
                    result[0] /= di[0];
                    // Обработка части al, где есть 0
                    for (int i = 1; i < bandWidth; i++)// обрабатываем i строку
                    {
                        for (int j = bandWidth - i; j < bandWidth; j++)
                            result[i] -= au[i][j] * result[j + i - bandWidth];
                        result[i] /= di[i];
                    }
                    //Обработка без 0
                    for (int i = bandWidth; i < n; i++)
                    {
                        for (int j = i - bandWidth; j < i; j++)
                            result[i] -= au[i][j - i + bandWidth] * result[j];
                        result[i] /= di[i];
                    }
                }
                else
                {
                    // Обработка части al, где есть 0
                    for (int i = 1; i < bandWidth; i++)// обрабатываем i строку
                        for (int j = bandWidth - i; j < bandWidth; j++)
                            result[i] -= au[i][j] * result[j + i - bandWidth];
                    //Обработка без 0
                    for (int i = bandWidth; i < n; i++)
                        for (int j = i - bandWidth; j < i; j++)
                            result[i] -= au[i][j - i + bandWidth] * result[j];
                }

                return result;
            }
            else
                throw new Exception("Ленточный формат: Несовпадение размерностей матрицы и вектора при обратном (T) ходе");
        }
示例#2
0
 public override Vector USolve(Vector x, bool UseDiagonal)
 {
     if (x.Size != n)
         throw new Exception("Несовпадение длин у операндов при USolve");
     else
     {
         int i, j;
         Vector v;
         if (UseDiagonal == true)// Деление на динагональ
         {
             v = (Vector)x.Clone();// в смысле копирование элементов
             for (i = n - 1; i >= 0; i--)
             {
                 v[i] /= di[i];
                 for (j = ia[i]; j < ia[i + 1]; j++)
                     v[ja[j]] -= au[j] * v[i];
             }
             return v;
         }
         else// Без деления на диагональ
         {
             v = (Vector)x.Clone();// в смысле копирование элементов
             for (i = n - 1; i >= 0; i--)
                 for (j = ia[i]; j < ia[i + 1]; j++)
                     v[ja[j]] -= au[j] * v[i];
             return v;
         }
     }
 }
示例#3
0
        public override Vector USolve(Vector x, bool UseDiagonal)
        {
            if (x.Size != _count)
                throw new Exception("Несовпадение длин у операндов USolve");

            Vector vector = (Vector)x.Clone();
            if (UseDiagonal)
            {
                for (int row = _count - 1; row >= 0; row--)
                {
                    vector[row] /= _di[row];
                    int start = row - (_ig[row + 1] - _ig[row]);
                    for (int column = _ig[row + 1] - 1, index = row - 1; index >= start; column--, index--)
                        vector[index] -= _au[column] * vector[row];
                }
            }

            else
            {
                for (int row = _count - 1; row >= 0; row--)
                {
                    int start = row - (_ig[row + 1] - _ig[row]);
                    for (int column = _ig[row + 1] - 1, index = row - 1; index >= start; column--, index--)
                        vector[index] -= _au[column] * vector[row];
                }
            }

            return vector;
        }
示例#4
0
        public override Vector USolve(Vector x, bool UseDiagonal)
        {
            if (n == x.Size)
            {
                //Vector result = new Vector(n);
                // Разобраться с присваиванием, пока обобщенно написано
                //result =  x;
                Vector result = (Vector) x.Clone();
                if (UseDiagonal)
                {
                    result[n - 1] /= di[n - 1];
                    // без 0
                    for (int i = n - 1; i >= bandWidth; i--)
                    {
                        for (int j = bandWidth - 1; j >= 0; j--)
                            result[i + j - bandWidth] -= au[i][j] * result[i];
                        result[i - 1] /= di[i - 1];
                    }
                    // с 0
                    for (int i = bandWidth - 1; i > 0; i--)
                    {
                        for (int j = bandWidth - 1; j >= bandWidth - i; j--)
                            result[i + j - bandWidth] -= au[i][j] * result[i];
                        result[i - 1] /= di[i - 1];
                    }

                }
                else
                {
                    // без 0
                    for (int i = n - 1; i >= bandWidth; i--)
                        for (int j = bandWidth - 1; j >= 0; j--)
                            result[i + j - bandWidth] -= au[i][j] * result[i];
                    // с 0
                    for (int i = bandWidth - 1; i > 0; i--)
                        for (int j = bandWidth - 1; j >= bandWidth - i; j--)
                            result[i + j - bandWidth] -= au[i][j] * result[i];

                }

                return result;

            }
            else
                throw new Exception("Ленточный формат: Несовпадение размерностей матрицы и вектора при обратном ходе");
        }
示例#5
0
        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("Диагональный формат: Несовпадение размерностей матрицы и вектора в прямом ходе");
        }
示例#6
0
        public override Vector USolve(Vector x, bool UseDiagonal)
        {
            if (di.Length == x.Size)
            {
                Vector result = (Vector)x.Clone();

                if (UseDiagonal)
                {
                    int n = di.Length - shift_u[shift_u.Length - 1];

                    result[di.Length - 1] /= di[di.Length - 1];
                    for (int i = di.Length - 1; i >= n; i--)
                    {
                        for (int j = 0; j < shift_u.Length; j++)
                            result[i - shift_u[j]] -= au[i][j] * result[i];
                        result[i] /= di[i];
                    }
                }
                else
                {
                    int n = di.Length - shift_u[shift_u.Length - 1];

                    for (int i = di.Length - 1; i >= n; i--)
                        for (int j = 0; j < shift_u.Length; j++)
                            result[i - shift_u[j]] -= au[i][j] * result[i];
                }
                return result;
            }
            else
                throw new Exception("Диагональный формат: Несовпадение размерностей матрицы и вектора в обратном ходе");
        }
示例#7
0
        public override Vector USolve(Vector x, bool UseDiagonal)
        {
            if (x.Size != n)
                throw new Exception("Несовпадение длин у операндов USolve");
            else
            {
                if (UseDiagonal == true)
                {
                    Vector v;
                    v = (Vector)x.Clone();// в смысле копирование элементов
                    for (int i = n - 1; i >= 0; i--)
                    {

                        for (int j = i + 1; j < n; j++)
                            v[i] -= a[i][j] * v[j];
                        v[i] /= a[i][i];
                    }
                    return v;
                }
                else
                {
                    Vector v;
                    v = (Vector)x.Clone();// в смысле копирование элементов
                    for (int i = n - 1; i >= 0; i--)
                        for (int j = i + 1; j < n; j++)
                            v[i] -= a[i][j] * v[j];
                    return v;
                }
            }
        }
 public Vector SSolve(Vector x)
 {
     return x.Clone() as Vector;
 }
 public Vector SMultiply(Vector x)
 {
     return x.Clone() as Vector;
 }