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

◆ eigenvectors_symmetric() [1/2]

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

Definition at line 513 of file lapack.cpp.

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'; /* Upper triangular part makes symmetric matrix */
534
535 int wsize = 3 * size - 1;
536 double* workspace = new double[wsize];
537 int info;
538
539 std::vector<double> evecs = make_lapack_array(*A);
540 std::vector<double> evals(size);
541
542 dsyev_(
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 // Copy results to eigvals, eigvecs
558 eigvecs->resize(size, size);
559 fill_from_lapack_array(evecs, *eigvecs);
560 eigvals->resize(size, 1);
561 fill_from_lapack_array(evals, *eigvals);
562 }
563
564 delete [] workspace;
565
566 return ret;
567}
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().