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

◆ eigenvectors_hermitian() [1/2]

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

Definition at line 1426 of file lapack.cpp.

1429{
1430 int size = static_cast<int>(A->numRows());
1431 if (size != static_cast<int>(A->numColumns()))
1432 {
1433 ERROR("expected a square matrix");
1434 return false;
1435 }
1436
1437 if (size == 0)
1438 {
1439 eigvals->resize(0, 1);
1440 eigvecs->resize(0, 0);
1441 return true;
1442 }
1443
1444 bool ret = true;
1445 char doit = 'V';
1446 char triangle = 'U'; /* Upper triangular part makes symmetric matrix */
1447
1448 int wsize = 2 * size - 1;
1449 double *workspace = new double[2*wsize];
1450 double *rwork = new double[3 * size - 2];
1451 int info;
1452
1453 std::vector<double> evecs = make_lapack_array(*A);
1454 std::vector<double> evals(size);
1455
1456 zheev_(&doit,
1457 &triangle,
1458 &size,
1459 evecs.data(),
1460 &size,
1461 evals.data(),
1462 workspace,
1463 &wsize,
1464 rwork,
1465 &info);
1466
1467 if (info < 0)
1468 {
1469 ERROR("argument passed to zheev had an illegal value");
1470 ret = false;
1471 }
1472 else if (info > 0)
1473 {
1474 ERROR("zheev did not converge");
1475 ret = false;
1476 }
1477 else
1478 {
1479 eigvals->resize(size, 1);
1480 fill_from_lapack_array(evals, *eigvals);
1481 eigvecs->resize(size, size);
1482 fill_from_lapack_array(evecs, *eigvecs);
1483 }
1484
1485 delete[] workspace;
1486 delete[] rwork;
1487
1488 return ret;
1489}
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 zheev_(char *n, char *n2, int *size, double *M, int *lda, double *eig, double *w, int *wsize, double *rwork, int *info)
const int ERROR
Definition m2-mem.cpp:55

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