diff --git a/include/armadillo_bits/op_powmat_meat.hpp b/include/armadillo_bits/op_powmat_meat.hpp index 3157fa6a..b464209e 100644 --- a/include/armadillo_bits/op_powmat_meat.hpp +++ b/include/armadillo_bits/op_powmat_meat.hpp @@ -216,11 +216,23 @@ op_powmat_cx::apply_direct(Mat< std::complex >& out, cons Col eigval; Mat eigvec; - const bool eig_status = eig_sym(eigval, eigvec, A); + bool eig_status = eig_sym(eigval, eigvec, A); if(eig_status) { - eigval = pow(eigval, y); // BUG: when in_eT is real, this will produce NaN for negative eigenvalues and non-integer exponent + // NOTE: when in_eT is real, pow(eigval, y) will produce NaN for negative eigenvalues and non-integer exponent; + // NOTE: the all_pos check is a workaround + + bool all_pos = true; + + for(uword i=0; i < eigval.n_elem; ++i) { all_pos = (eigval[i] <= in_T(0)) ? false : all_pos; } + + if(all_pos == false) { eig_status = false; } + } + + if(eig_status) + { + eigval = pow(eigval, y); const Mat tmp = diagmat(eigval) * eigvec.t();