diff --git a/include/armadillo_bits/glue_solve_meat.hpp b/include/armadillo_bits/glue_solve_meat.hpp index 4bff6068..8f8d348b 100644 --- a/include/armadillo_bits/glue_solve_meat.hpp +++ b/include/armadillo_bits/glue_solve_meat.hpp @@ -288,7 +288,7 @@ glue_solve_gen_full::apply(Mat& out, const Base& A_expr, const Base::epsilon()) ) + if( (allow_ugly == false) && (status == true) && (fast == false) && ( (rcond < std::numeric_limits::epsilon()) || arma_isnan(rcond) ) ) { status = false; } @@ -324,7 +324,7 @@ glue_solve_gen_full::apply(Mat& out, const Base& A_expr, const Base::epsilon()) ) + if( (allow_ugly == false) && (status == true) && (fast == false) && ( (rcond < std::numeric_limits::epsilon()) || arma_isnan(rcond) ) ) { status = false; } @@ -402,7 +402,7 @@ glue_solve_tri_default::apply(Mat& actual_out, const Base& A_expr, co status = auxlib::solve_trimat_rcond(out, rcond, A, B_expr.get_ref(), layout); // A is not modified - if( (status == true) && (rcond < std::numeric_limits::epsilon()) ) + if( (status == true) && ( (rcond < std::numeric_limits::epsilon()) || arma_isnan(rcond) ) ) { status = false; } @@ -514,7 +514,7 @@ glue_solve_tri_full::apply(Mat& actual_out, const Base& A_expr, const status = auxlib::solve_trimat_rcond(out, rcond, A, B_expr.get_ref(), layout); // A is not modified } - if( (allow_ugly == false) && (status == true) && (fast == false) && (rcond < std::numeric_limits::epsilon()) ) + if( (allow_ugly == false) && (status == true) && (fast == false) && ( (rcond < std::numeric_limits::epsilon()) || arma_isnan(rcond) ) ) { status = false; } diff --git a/include/armadillo_bits/op_inv_gen_meat.hpp b/include/armadillo_bits/op_inv_gen_meat.hpp index 7ce3cd47..329f6bbc 100644 --- a/include/armadillo_bits/op_inv_gen_meat.hpp +++ b/include/armadillo_bits/op_inv_gen_meat.hpp @@ -111,7 +111,7 @@ op_inv_gen_full::apply_direct(Mat& out, const Base::epsilon())) { return false; } + if((status == false) || (inv_state.rcond < std::numeric_limits::epsilon()) || arma_isnan(inv_state.rcond)) { return false; } return true; } @@ -124,7 +124,7 @@ op_inv_gen_full::apply_direct(Mat& out, const Base::epsilon())) + if((status == false) || (inv_state.rcond < std::numeric_limits::epsilon()) || arma_isnan(inv_state.rcond)) { Mat A = expr.get_ref(); diff --git a/include/armadillo_bits/op_inv_spd_meat.hpp b/include/armadillo_bits/op_inv_spd_meat.hpp index 440eb08c..09f0b044 100644 --- a/include/armadillo_bits/op_inv_spd_meat.hpp +++ b/include/armadillo_bits/op_inv_spd_meat.hpp @@ -113,7 +113,7 @@ op_inv_spd_full::apply_direct(Mat& out, const Base::epsilon())) { return false; } + if((status == false) || (rcond < std::numeric_limits::epsilon()) || arma_isnan(rcond)) { return false; } return true; } @@ -126,7 +126,7 @@ op_inv_spd_full::apply_direct(Mat& out, const Base::epsilon())) + if((status == false) || (rcond < std::numeric_limits::epsilon()) || arma_isnan(rcond)) { const Mat A = expr.get_ref();