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) ходе"); }
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; } } }
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; }
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("Ленточный формат: Несовпадение размерностей матрицы и вектора при обратном ходе"); }
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("Диагональный формат: Несовпадение размерностей матрицы и вектора в прямом ходе"); }
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("Диагональный формат: Несовпадение размерностей матрицы и вектора в обратном ходе"); }
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; }