368{
369 int size =
static_cast<int>(A->
numRows());
370 if (size !=
static_cast<int>(A->
numColumns()))
371 {
372 ERROR(
"expected a square matrix");
373 return false;
374 }
375
376 if (size == 0)
377 {
378 eigvals->resize(0, 1);
379 eigvecs->resize(0, 0);
380 return true;
381 }
382
383 bool ret = true;
384 char dont = 'N';
385 char doit = 'V';
386 int wsize = 4 * size;
387
388 double *workspace = new double[2*wsize];
389 int info;
390
392 double *real = new double[size];
393 double *imag = new double[size];
394 double *eigen = new double[size * size];
395
397 &doit,
398 &size,
399 copyA.data(),
400 &size,
401 real,
402 imag,
403 static_cast<double *>(nullptr),
404 &size,
405 eigen,
406 &size,
407 workspace,
408 &wsize,
409 &info);
410
411 if (info < 0)
412 {
413 ERROR(
"argument passed to dgeev had an illegal value");
414 ret = false;
415 }
416 else if (info > 0)
417 {
418 ERROR(
"the QR algorithm in dgeev failed to compute all eigvals");
419 ret = false;
420 }
421 else
422 {
423
424 eigvals->resize(size, 1);
425 eigvecs->resize(size, size);
426
427 double* eigenLoc = eigen;
428 for (int j = 0; j < size; j++, eigenLoc += size)
429 {
430 eigvals->ring().set_from_doubles(eigvals->entry(j,0), real[j], imag[j]);
431
432
433 if (imag[j] == 0)
434 {
435 for (int i = 0; i < size; ++i)
436 {
437 eigvecs->entry(i,j).re = eigenLoc[i];
438 eigvecs->entry(i,j).im = 0;
439 }
440 }
441 else if (imag[j] > 0)
442 {
443 for (int i = 0; i < size; ++i)
444 {
445 eigvecs->ring().set_from_doubles(eigvecs->entry(i,j),
446 eigenLoc[i], eigenLoc[size + i]);
447 eigvecs->ring().set_from_doubles(eigvecs->entry(i,j+1),
448 eigenLoc[i], - eigenLoc[size + i]);
449 }
450 }
451 }
452 }
453
454 delete [] workspace;
455 delete [] real;
456 delete [] imag;
457 delete [] eigen;
458
459 return ret;
460}
size_t numColumns() const
std::vector< double > make_lapack_array(const DMatRR &mat)
int dgeev_(char *n, char *n2, int *size, double *M, int *size1, double *E, double *E2, double *, int *, double *, int *, double *, int *, int *)