Macaulay2 Engine
Loading...
Searching...
No Matches

◆ eigenvalues_symmetric() [1/2]

bool Lapack::eigenvalues_symmetric ( const DMatRR * A,
DMatRR * eigenvals )
static

Definition at line 462 of file lapack.cpp.

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'; /* Upper triangular part makes symmetric matrix. */
480 int info;
481
482 int wsize = 3 * size - 1;
483 double * workspace = new double[wsize];
484
485 std::vector<double> copyA = make_lapack_array(*A);
486 std::vector<double> evals(size);
487
488 dsyev_(
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 // Copy eigenvalues back to eigvals
504 eigvals->resize(size, 1);
505 fill_from_lapack_array(evals, *eigvals);
506 }
507
508 delete [] workspace;
509
510 return ret;
511}
size_t numRows() const
Definition dmat.hpp:144
size_t numColumns() const
Definition dmat.hpp:145
std::vector< double > make_lapack_array(const DMatRR &mat)
Definition lapack.cpp:20
void fill_from_lapack_array(const std::vector< double > &doubles, DMatRR &mat)
Definition lapack.cpp:45
int dsyev_(char *n, char *n2, int *size, double *M, int *lda, double *eig, double *work, int *wsize, int *info)
const int ERROR
Definition m2-mem.cpp:55

References dsyev_(), ERROR, fill_from_lapack_array(), make_lapack_array(), DMat< ACoeffRing >::numColumns(), DMat< ACoeffRing >::numRows(), and DMat< ACoeffRing >::resize().