void dense_bilinear::multisolve(const dense_bilinear &rhs, dense_bilinear &result) const{ int i, j; i = 0; j = 0; if (this->columns != result.columns){ std::cerr << "Dense bilinear Multisolve failed. There are not the same number of columns in b(" << this->rows << "," << this->columns << ") and x(" << result.rows << "," << result.columns << ")." << std::endl; exit(-1); } matrix LU(rhs.rows, rhs.columns), pivots(rhs.rows, 1), temp(this->rows, this->columns); partialpivotingLU(rhs,LU,pivots); for(i = 0; i < this->get_rows(); i++){ for(j = 0; j <this->get_cols(); j++){ temp(i,j) = (*this)(pivots(i,0),j); } } for(i = 0; i < temp.columns; i++){ UnitLowerTriangleSolve(LU,temp,result,i,i); } temp = result; for(i = 0; i < temp.columns; i++){ UpperTriangleSolve(LU,temp,result,i,i); } }
double determinant(ublas::matrix<double> input) { ublas::permutation_matrix<std::size_t> pivots(input.size1()); ublas::lu_factorize(input, pivots); double det = 1.0; for (std::size_t i = 0; i < pivots.size(); i++) { if (pivots(i) != i) det *= -1.0; det *= input(i, i); } return det; }
inline double determinant(ublas::matrix_expression<matrix_T> const& mat_r) { double det = 1.0; matrix_T mLu(mat_r() ); ublas::permutation_matrix<std::size_t> pivots(mat_r().size1() ); int is_singular = lu_factorize(mLu, pivots); if (!is_singular) { for (std::size_t i=0; i < pivots.size(); ++i) { if (pivots(i) != i) det *= -1.0; det *= mLu(i,i); } } else { det = 0.0; } return det; }
void dense_bilinear::solve(const dense_bilinear &rhs, dense_bilinear &result, int index) const{ int i, j; i = 0; j = 0; matrix LU(rhs.rows, rhs.columns), pivots(rhs.rows, 1), temp(this->rows, this->columns); partialpivotingLU(rhs,LU,pivots); for(i = 0; i < this->get_rows(); i++){ for(j = 0; j <this->get_cols(); j++){ temp(i,j) = (*this)(pivots(i,0),j); } } UnitLowerTriangleSolve(LU,temp,result,index); temp = result; UpperTriangleSolve(LU,temp,result); }
double determinant(boost::numeric::ublas::matrix_expression<MatrixT> const & mat_r) { double det = 1.0; MatrixT mLu(mat_r()); boost::numeric::ublas::permutation_matrix<vcl_size_t> pivots(mat_r().size1()); int is_singular = static_cast<int>(lu_factorize(mLu, pivots)); if (!is_singular) { for (vcl_size_t i=0; i < pivots.size(); ++i) { if (pivots(i) != i) det *= -1.0; det *= mLu(i,i); } } else det = 0.0; return det; }
inline bool timeToRefactorize() const { return (pivots() * 3 > maximumPivots() * 2 && numberElementsR() * 3 > (numberElementsL() + numberElementsU()) * 2 + 1000 && !numberDense()); }