463{
464 int size =
static_cast<int>(A->
numRows());
465 if (size !=
static_cast<int>(A->
numColumns()))
466 {
467 ERROR(
"expected a square matrix");
468 return false;
469 }
470
471 if (size == 0)
472 {
473 eigvals->resize(0, 1);
474 return true;
475 }
476
477 bool ret = true;
478 char dont = 'N';
479 char triangle = 'U';
480 int info;
481
482 int wsize = 3 * size - 1;
483 double * workspace = new double[wsize];
484
486 std::vector<double> evals(size);
487
489 &dont, &triangle, &size, copyA.data(), &size, evals.data(), workspace, &wsize, &info);
490
491 if (info < 0)
492 {
493 ERROR(
"argument passed to dsyev had an illegal value");
494 ret = false;
495 }
496 else if (info > 0)
497 {
498 ERROR(
"dsyev did not converge");
499 ret = false;
500 }
501 else
502 {
503
504 eigvals->resize(size, 1);
506 }
507
508 delete [] workspace;
509
510 return ret;
511}
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)