//умножение на транспонированный нижний треугольник public IVector LMultTranspose(IVector vector, bool UseDiagonal, DiagonalElement diagonalElement = DiagonalElement.One) { if (vector == null) { throw new ArgumentNullException(nameof(vector)); } if (vector.Size != Size) { throw new RankException(); } var result = new Vector(Size); for (int i = Size - 1; i >= 0; i--) { var ia1 = ia[i]; //1ый элемент строки var ia2 = ia[i + 1]; //последний элемент строки int j; for (; ja[ia1] < i && ia1 < ia2; ia1++) { j = ja[ia1]; result[j] += a[ia1] * vector[i]; } j = ja[ia1]; if (j == i && ia1 < ia2) { result[j] += UseDiagonal? a[ia1] * vector[j]: (double)diagonalElement * vector[j]; } } return(result); }
//умножение на транспонированный верхний треугольник public IVector UMultTranspose(IVector vector, bool UseDiagonal, DiagonalElement diagonalElement = DiagonalElement.One) { if (vector == null) { throw new ArgumentNullException(nameof(vector)); } if (vector.Size != Size) { throw new RankException(); } var result = new Vector(Size); for (int i = 0; i < Size; i++) { var ia1 = ia[i]; var ia2 = ia[i + 1] - 1; var j = ja[ia2]; for (; i < j && ia1 < ia2; ia2--) { j = ja[ia2]; result[j] += a[ia2] * vector[i]; } j = ja[ia2]; if (j == i && ia1 <= ia2) { result[i] += UseDiagonal ? a[ia2] * vector[i] : (double)diagonalElement * vector[i]; } } return(result); }
public IVector UMult(IVector vector, bool isUseDiagonal, DiagonalElement diagonalElement = DiagonalElement.One) { if (vector == null) { throw new ArgumentNullException(nameof(vector)); } if (vector.Size != Size) { throw new RankException(); } var result = new Vector(Size); for (int i = 0; i < Size; i++) { result[i] += isUseDiagonal ? matrix[i][i] * vector[i] : (int)diagonalElement * vector[i]; for (int j = 0; j < i; j++) { result[j] += matrix[i][j] * vector[i]; } } return(result); }
//умножение на нижний треугольник public IVector LMult(IVector vector, bool UseDiagonal, DiagonalElement diagonalElement = DiagonalElement.One) { if (vector == null) { throw new ArgumentNullException(nameof(vector)); } if (vector.Size != Size) { throw new RankException(); } var result = new Vector(Size); for (int i = 0; i < Size; i++) { double sum = 0; var ia1 = ia[i]; //1ый элемент строки var ia2 = ia[i + 1]; //1ый элемент следующий строки строки int j; for (; ja[ia1] < i && ia1 < ia2; ia1++) { j = ja[ia1]; sum += a[ia1] * vector[j]; } j = ja[ia1]; if (j == i && ia1 < ia2) { sum += UseDiagonal ? a[ia1] * vector[j]: (double)diagonalElement * vector[j]; } result[i] = sum; } return(result); }
//умножение на верхний треугольник трансп public IVector UMultTranspose(IVector vector, bool isUseDiagonal, DiagonalElement diagonalElement = DiagonalElement.One) { if (vector == null) { throw new ArgumentNullException(nameof(vector)); } if (vector.Size != Size) { throw new RankException(); } var result = new Vector(Size); for (int j = 0; j < Size; j++) { int k = ia[j]; for (int i = j - (ia[j + 1] - k); i < j; i++, k++) { result[j] += au[k] * vector[i]; } } for (int i = 0; i < Size; i++) { result[i] += isUseDiagonal ? di[i] * vector[i] : (double)diagonalElement * vector[i]; } return(result); }
public IVector UMultTranspose(IVector vector, bool isUseDiagonal, DiagonalElement diagonalElement = DiagonalElement.One) { if (vector == null) { throw new ArgumentNullException(nameof(vector)); } if (vector.Size != Size) { throw new RankException(); } var result = new Vector(Size); for (int i = 0; i < Size; i++) { result[i] = isUseDiagonal ? di[i] * vector[i] : (int)diagonalElement * vector[i]; for (int j = ia[i]; j < ia[i + 1]; j++) { var column = ja[j]; result[i] += au[j] * vector[column]; } } return(result); }
//умножение на верхний треугольник public IVector UMult(IVector vector, bool UseDiagonal, DiagonalElement diagonalElement = DiagonalElement.One) { if (vector == null) { throw new ArgumentNullException(nameof(vector)); } if (vector.Size != Size) { throw new RankException(); } var result = new Vector(Size); for (int i = Size - 1; i >= 0; i--) { var ia1 = ia[i]; var ia2 = ia[i + 1] - 1; result[i] += UseDiagonal ? a[ia2] * vector[i] : (double)diagonalElement * vector[i]; for (ia2--; ia1 <= ia2; ia2--) { var j = ja[ia2]; result[j] += a[ia2] * vector[i]; } } return(result); }
//умножение на нижний треугольник public IVector LMult(IVector vector, bool UseDiagonal, DiagonalElement diagonalElement = DiagonalElement.One) { if (vector == null) { throw new ArgumentNullException(nameof(vector)); } if (vector.Size != Size) { throw new RankException(); } var result = new Vector(Size); for (int i = 0; i < Size; i++) { double sum = 0; var ia1 = ia[i]; var ia2 = ia[i + 1]; for (; i > ja[ia1] && ia1 < ia2; ia1++) { var j = ja[ia1]; sum += a[ia1] * vector[j]; } if (i == ja[ia1]) { sum += UseDiagonal ? a[ia1] * vector[i]: (double)diagonalElement * vector[i]; } else { throw new ArgumentNullException(nameof(a)); } result[i] = sum; } return(result); }
public IVector UMultTranspose(IVector vector, bool isUseDiagonal, DiagonalElement diagonalElement = DiagonalElement.One) { if (vector == null) { throw new ArgumentNullException(nameof(vector)); } if (vector.Size != Size) { throw new RankException(); } var result = new Vector(Size); for (int j = 0; j < Size; j++) { var sum = isUseDiagonal ? matrix[j, j] * vector[j] : (int)diagonalElement * vector[j]; for (int i = 0; i < j; i++) { sum += matrix[i, j] * vector[i]; } result[j] = sum; } return(result); }
public IVector UMult(IVector x, bool UseDiagonal, DiagonalElement diagonalElement = DiagonalElement.One) { Counters.UMult.Inc(); return(linear.UMult(x, UseDiagonal, diagonalElement)); }
public IVector UMult(IVector vector, bool isUseDiagonal, DiagonalElement diagonalElement = DiagonalElement.One) => Matrix.UMultTranspose(vector, isUseDiagonal, diagonalElement);