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);
  }

}
Beispiel #2
0
    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);

} 
Beispiel #5
0
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;
}
Beispiel #6
0
 inline bool timeToRefactorize() const {
      return (pivots() * 3 > maximumPivots() * 2 &&
              numberElementsR() * 3 > (numberElementsL() + numberElementsU()) * 2 + 1000 &&
              !numberDense());
 }