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

◆ eigenvectors() [1/4]

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

Definition at line 1296 of file lapack.cpp.

1299{
1300 int size = static_cast<int>(A->numRows());
1301 if (size != static_cast<int>(A->numColumns()))
1302 {
1303 ERROR("expected a square matrix");
1304 return false;
1305 }
1306
1307 if (size == 0)
1308 {
1309 eigvals->resize(0, 1);
1310 eigvecs->resize(0, 0);
1311 return true;
1312 }
1313
1314 bool ret = true;
1315 char dont = 'N';
1316 char doit = 'V';
1317 int wsize = 2 * size;
1318 int rsize = 2 * size;
1319 double *workspace = new double[2*wsize];
1320 double *rwork = new double[rsize];
1321 int info;
1322
1323 std::vector<double> copyA = make_lapack_array(*A);
1324 std::vector<double> evals(2 * size);
1325 std::vector<double> evecs(2 * size * size);
1326
1327 zgeev_(&dont,
1328 &doit,
1329 &size,
1330 copyA.data(),
1331 &size,
1332 evals.data(),
1333 static_cast<double *>(nullptr),
1334 &size, /* left eigvecs */
1335 evecs.data(),
1336 &size, /* right eigvecs */
1337 workspace,
1338 &wsize,
1339 rwork,
1340 &info);
1341
1342 if (info < 0)
1343 {
1344 ERROR("argument passed to zgeev had an illegal value");
1345 ret = false;
1346 }
1347 else if (info > 0)
1348 {
1349 ERROR("the QR algorithm in zgeev failed to compute all eigvals");
1350 ret = false;
1351 }
1352 else
1353 {
1354 eigvals->resize(size, 1);
1355 fill_from_lapack_array(evals, *eigvals);
1356 eigvecs->resize(size, size);
1357 fill_from_lapack_array(evecs, *eigvecs);
1358 }
1359
1360 delete[] workspace;
1361 delete[] rwork;
1362
1363 return ret;
1364}
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 zgeev_(char *n, char *n2, int *size, double *M, int *size1, double *E, double *l, int *lsize, double *r, int *rsize, 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 zgeev_().