void fgRealSymmEigs( const FgMatrixV<T> &rsm, FgMatrixV<T> &val, // RETURNED: Col vector of eigenvalues, smallest to largest FgMatrixV<T> &vec) // RETURNED: Col vectors are respective eigenvectors { // JAMA enters an infinite loop with NaNs: for (size_t ii=0; ii<rsm.m_data.size(); ++ii) FGASSERT(boost::math::isfinite(rsm.m_data[ii])); uint dim = rsm.numRows(); FGASSERT(rsm.numCols() == dim); // We use a const cast since we know 'solver' will not modify the elements, even though // the Array2D object holds a non-const pointer to our data. JAMA::Eigenvalue<T> solver(TNT::Array2D<T>(rsm.numRows(),rsm.numCols(),const_cast<T*>(rsm.dataPtr()))); TNT::Array2D<T> vecs; TNT::Array1D<T> vals; solver.getV(vecs); solver.getRealEigenvalues(vals); val.resize(dim,1); vec.resize(dim,dim); int idim = static_cast<int>(dim); for (int row=0; row<idim; row++) { val[row] = vals[row]; for (uint col=0; col<dim; col++) vec.elem(row,col) = vecs[row][col]; } }