diff --git a/include/armadillo_bits/op_inv_rcond_meat.hpp b/include/armadillo_bits/op_inv_rcond_meat.hpp index 4eabf0c7..60724355 100644 --- a/include/armadillo_bits/op_inv_rcond_meat.hpp +++ b/include/armadillo_bits/op_inv_rcond_meat.hpp @@ -38,9 +38,43 @@ op_inv_rcond::apply_direct_gen(Mat& out, typename T1::po arma_debug_check( (out.is_square() == false), "inv(): given matrix must be square sized" ); - const bool status = auxlib::inv_rcond(out, out_rcond); + const uword N = out.n_rows; - return status; + if(is_op_diagmat::value || out.is_diagmat()) + { + arma_extra_debug_print("op_inv_rcond: detected diagonal matrix"); + + eT* colmem = out.memptr(); + + T max_abs_src_val = T(0); + T max_abs_inv_val = T(0); + + for(uword i=0; i max_abs_src_val) ? abs_src_val : max_abs_src_val; + max_abs_inv_val = (abs_inv_val > max_abs_inv_val) ? abs_inv_val : max_abs_inv_val; + + colmem += N; + } + + out_rcond = T(1) / (max_abs_src_val * max_abs_inv_val); + + return true; + } + + return auxlib::inv_rcond(out, out_rcond); }