516{
517 int size =
static_cast<int>(A->
numRows());
518 if (size !=
static_cast<int>(A->
numColumns()))
519 {
520 ERROR(
"expected a square matrix");
521 return false;
522 }
523
524 if (size == 0)
525 {
526 eigvals->resize(0, 1);
527 eigvecs->resize(0, 0);
528 return true;
529 }
530
531 bool ret = true;
532 char doit = 'V';
533 char triangle = 'U';
534
535 int wsize = 3 * size - 1;
536 double* workspace = new double[wsize];
537 int info;
538
540 std::vector<double> evals(size);
541
543 &doit, &triangle, &size, evecs.data(), &size, evals.data(), workspace, &wsize, &info);
544
545 if (info < 0)
546 {
547 ERROR(
"argument passed to dsyev had an illegal value");
548 ret = false;
549 }
550 else if (info > 0)
551 {
552 ERROR(
"dsyev did not converge");
553 ret = false;
554 }
555 else
556 {
557
558 eigvecs->resize(size, size);
560 eigvals->resize(size, 1);
562 }
563
564 delete [] workspace;
565
566 return ret;
567}
size_t numColumns() const
std::vector< double > make_lapack_array(const DMatRR &mat)
void fill_from_lapack_array(const std::vector< double > &doubles, DMatRR &mat)
int dsyev_(char *n, char *n2, int *size, double *M, int *lda, double *eig, double *work, int *wsize, int *info)