workaround

This commit is contained in:
conrad
2024-11-06 13:40:28 +10:00
parent 2b606b139c
commit ef95c25d2f
+14 -2
View File
@@ -216,11 +216,23 @@ op_powmat_cx::apply_direct(Mat< std::complex<typename T1::pod_type> >& out, cons
Col<in_T> eigval;
Mat<in_eT> 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<in_eT> tmp = diagmat(eigval) * eigvec.t();