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

◆ eigenvalues() [1/4]

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

Definition at line 1233 of file lapack.cpp.

1234{
1235 int size = static_cast<int>(A->numRows());
1236 if (size != static_cast<int>(A->numColumns()))
1237 {
1238 ERROR("expected a square matrix");
1239 return false;
1240 }
1241
1242 if (size == 0)
1243 {
1244 eigvals->resize(0, 1);
1245 return true;
1246 }
1247
1248 bool ret = true;
1249 char dont = 'N';
1250 int info;
1251 int wsize = 2 * size;
1252 int rsize = 2 * size;
1253 double *workspace = new double[2*wsize];
1254 double *rwork = new double[rsize];
1255
1256 std::vector<double> copyA = make_lapack_array(*A);
1257 std::vector<double> evals(2 * size); // TODO: set to 0?
1258
1259 zgeev_(&dont,
1260 &dont,
1261 &size,
1262 copyA.data(),
1263 &size,
1264 evals.data(),
1265 static_cast<double *>(nullptr),
1266 &size, /* left eigenvectors */
1267 static_cast<double *>(nullptr),
1268 &size, /* right eigenvectors */
1269 workspace,
1270 &wsize,
1271 rwork,
1272 &info);
1273
1274 if (info < 0)
1275 {
1276 ERROR("argument passed to zgeev had an illegal value");
1277 ret = false;
1278 }
1279 else if (info > 0)
1280 {
1281 ERROR("the QR algorithm in zgeev failed to compute all eigvals");
1282 ret = false;
1283 }
1284 else
1285 {
1286 eigvals->resize(size, 1);
1287 fill_from_lapack_array(evals, *eigvals);
1288 }
1289
1290 delete[] workspace;
1291 delete[] rwork;
1292
1293 return ret;
1294}
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_().