30#include <Eigen/Eigenvalues>
31#include <unsupported/Eigen/MatrixFunctions>
35#define MAX_(i, j) (((i) > (j)) ? (i) : (j))
36#define MIN_(i, j) (((i) < (j)) ? (i) : (j))
38template<
class Real,
class Scalar,
int M,
int N>
40(
const Eigen::Matrix<Scalar, M, N>& m,
41 Eigen::Array<Real,
MIN_(M, N), 1>& s,
42 Eigen::Matrix<Scalar, M, M> *u,
43 Eigen::Matrix<Scalar, N, N> *vh)
45 Eigen::JacobiSVD<Eigen::Matrix<Scalar, M, N> >
46 svd(m, (u ? Eigen::ComputeFullU : 0) | (vh ? Eigen::ComputeFullV : 0));
47 s =
svd.singularValues();
48 if (u) { *u =
svd.matrixU(); }
49 if (vh) { *vh =
svd.matrixV().adjoint(); }
52template<
class Real,
class Scalar,
int N>
54(
const Eigen::Matrix<Scalar, N, N>& m,
55 Eigen::Array<Real, N, 1>& w,
56 Eigen::Matrix<Scalar, N, N> *z)
58 Eigen::SelfAdjointEigenSolver<Eigen::Matrix<Scalar,N,N> > es;
59 if (N == 2 || N == 3) {
60 es.computeDirect(m, z ? Eigen::ComputeEigenvectors : Eigen::EigenvaluesOnly);
62 es.compute(m, z ? Eigen::ComputeEigenvectors : Eigen::EigenvaluesOnly);
65 if (z) { *z = es.eigenvectors(); }
71template<
int M,
int N,
class Real>
72void disna(
const char& JOB,
const Eigen::Array<Real,
MIN_(M, N), 1>& D,
73 Eigen::Array<Real,
MIN_(M, N), 1>& SEP,
int& INFO)
85 bool DECR, EIGEN, INCR, LEFT, RIGHT, SINGUL;
87 Real ANORM, EPS, NEWGAP, OLDGAP, SAFMIN, THRESH;
92 EIGEN = std::toupper(JOB) ==
'E';
93 LEFT = std::toupper(JOB) ==
'L';
94 RIGHT = std::toupper(JOB) ==
'R';
95 SINGUL = LEFT || RIGHT;
101 if (!EIGEN && !SINGUL) {
110 for (I = 0; I < K - 1; I++) {
112 INCR = INCR && D(I) <= D(I+1);
115 DECR = DECR && D(I) >= D(I+1);
118 if (SINGUL && K > 0) {
120 INCR = INCR && ZERO <= D(0);
123 DECR = DECR && D(K-1) >= ZERO;
126 if (!(INCR || DECR)) {
144 SEP(0) = std::numeric_limits<Real>::max();
146 OLDGAP = std::fabs(D(1) - D(0));
148 for (I = 1; I < K - 1; I++) {
149 NEWGAP = std::fabs(D(I+1) - D(I));
150 SEP(I) = std::min(OLDGAP, NEWGAP);
156 if ((LEFT && M > N) || (RIGHT && M < N)) {
158 SEP( 0 ) = std::min(SEP( 0 ), D( 0 ));
161 SEP(K-1) = std::min(SEP(K-1), D(K-1));
172 EPS = std::numeric_limits<Real>::epsilon();
173 SAFMIN = std::numeric_limits<Real>::min();
174 ANORM = std::max(std::fabs(D(0)), std::fabs(D(K-1)));
178 THRESH = std::max(EPS*ANORM, SAFMIN);
180 for (I = 0; I < K; I++) {
181 SEP(I) = std::max(SEP(I), THRESH);
186template<
class Real,
class Scalar,
int M,
int N>
188(
const Eigen::Matrix<Scalar, M, N>& m,
189 Eigen::Array<Real,
MIN_(M, N), 1>& s,
190 Eigen::Matrix<Scalar, M, M> *u,
191 Eigen::Matrix<Scalar, N, N> *vh)
196template<
class Real,
class Scalar,
int M,
int N>
198(
const Eigen::Matrix<Scalar, M, N>&
m,
200 Eigen::Matrix<Scalar, M, M> *
u = 0,
201 Eigen::Matrix<Scalar, N, N> *
vh = 0,
210 const Real EPSMCH = std::numeric_limits<Real>::epsilon();
249template<
class Real,
class Scalar,
int M,
int N>
251(
const Eigen::Matrix<Scalar, M, N>&
m,
253 Eigen::Matrix<Scalar, M, M>&
u,
254 Eigen::Matrix<Scalar, N, N>&
vh)
269template<
class Real,
class Scalar,
int M,
int N>
271(
const Eigen::Matrix<Scalar, M, N>&
m,
273 Eigen::Matrix<Scalar, M, M>&
u,
274 Eigen::Matrix<Scalar, N, N>&
vh,
292template<
class Real,
class Scalar,
int M,
int N>
294(
const Eigen::Matrix<Scalar, M, N>&
m,
296 Eigen::Matrix<Scalar, M, M>&
u,
297 Eigen::Matrix<Scalar, N, N>&
vh,
316template<
class Real,
class Scalar,
int M,
int N>
318(
const Eigen::Matrix<Scalar, M, N>&
m,
334template<
class Real,
class Scalar,
int M,
int N>
336(
const Eigen::Matrix<Scalar, M, N>&
m,
345template<
class Real,
class Scalar,
int N>
347(
const Eigen::Matrix<Scalar, N, N>&
m,
348 Eigen::Array<Real, N, 1>&
w,
349 Eigen::Matrix<Scalar, N, N> *
z)
354template<
class Real,
class Scalar,
int N>
356(
const Eigen::Matrix<Scalar, N, N>&
m,
357 Eigen::Array<Real, N, 1>&
w,
358 Eigen::Matrix<Scalar, N, N> *
z = 0,
360 Eigen::Array<Real, N, 1> *
z_errbd = 0)
366 const Real EPSMCH = std::numeric_limits<Real>::epsilon();
367 Real mnorm = std::max(std::abs(
w[0]), std::abs(
w[
N-1]));
371 Eigen::Array<Real, N, 1>
RCONDZ;
392template<
class Real,
class Scalar,
int N>
394(
const Eigen::Matrix<Scalar, N, N>&
m,
395 Eigen::Array<Real, N, 1>&
w,
396 Eigen::Matrix<Scalar, N, N>&
z)
412template<
class Real,
class Scalar,
int N>
414(
const Eigen::Matrix<Scalar, N, N>&
m,
415 Eigen::Array<Real, N, 1>&
w,
416 Eigen::Matrix<Scalar, N, N>&
z,
433template<
class Real,
class Scalar,
int N>
435(
const Eigen::Matrix<Scalar, N, N>&
m,
436 Eigen::Array<Real, N, 1>&
w,
437 Eigen::Matrix<Scalar, N, N>&
z,
439 Eigen::Array<Real, N, 1>&
z_errbd)
454template<
class Real,
class Scalar,
int N>
456(
const Eigen::Matrix<Scalar, N, N>&
m,
457 Eigen::Array<Real, N, 1>&
w)
473template<
class Real,
class Scalar,
int N>
475(
const Eigen::Matrix<Scalar, N, N>&
m,
476 Eigen::Array<Real, N, 1>&
w,
482template<
class Real,
int N>
484(
const Eigen::Matrix<std::complex<Real>,
N,
N>&
m,
485 Eigen::Array<Real, N, 1>&
s,
486 Eigen::Matrix<std::complex<Real>,
N,
N> *
u = 0,
488 Eigen::Array<Real, N, 1> *
u_errbd = 0)
494 Eigen::Matrix<std::complex<Real>,
N,
N>
vh;
497 Eigen::Matrix<std::complex<Real>,
N,
N>
const Z =
u->adjoint() *
vh.transpose();
498 Eigen::Matrix<std::complex<Real>,
N,
N>
Zsqrt =
Z.sqrt().eval();
499 if (!
Zsqrt.isUnitary()) {
505 [](std::complex<Real>
x,
int n) {
506 static constexpr Real pi = 3.141592653589793238462643383279503L;
507 return std::sqrt(0.25*
pi*
x)/(std::tgamma(
static_cast<Real>(1.5) -
n)*std::pow(
x,
n));
510 if (!
Zsqrt.isUnitary()) {
511 std::runtime_error(
"Zsqrt matrix must be unitary");
530template<
class Real,
int N>
532(
const Eigen::Matrix<std::complex<Real>,
N,
N>&
m,
533 Eigen::Array<Real, N, 1>&
s,
534 Eigen::Matrix<std::complex<Real>,
N,
N>&
u)
550template<
class Real,
int N>
552(
const Eigen::Matrix<std::complex<Real>,
N,
N>&
m,
553 Eigen::Array<Real, N, 1>&
s,
554 Eigen::Matrix<std::complex<Real>,
N,
N>&
u,
571template<
class Real,
int N>
573(
const Eigen::Matrix<std::complex<Real>,
N,
N>&
m,
574 Eigen::Array<Real, N, 1>&
s,
575 Eigen::Matrix<std::complex<Real>,
N,
N>&
u,
577 Eigen::Array<Real, N, 1>&
u_errbd)
591template<
class Real,
int N>
593(
const Eigen::Matrix<std::complex<Real>,
N,
N>&
m,
594 Eigen::Array<Real, N, 1>&
s)
610template<
class Real,
int N>
612(
const Eigen::Matrix<std::complex<Real>,
N,
N>&
m,
613 Eigen::Array<Real, N, 1>&
s,
621 std::complex<Real>
operator() (
const std::complex<Real>&
z)
const {
622 return z.real() < 0 ? std::complex<Real>(0,1) :
623 std::complex<Real>(1,0);
627template<
class Real,
int N>
629(
const Eigen::Matrix<Real, N, N>&
m,
630 Eigen::Array<Real, N, 1>&
s,
631 Eigen::Matrix<std::complex<Real>,
N,
N> *
u = 0,
633 Eigen::Array<Real, N, 1> *
u_errbd = 0)
635 Eigen::Matrix<Real, N, N>
z;
662template<
class Real,
int N>
664(
const Eigen::Matrix<Real, N, N>&
m,
665 Eigen::Array<Real, N, 1>&
s,
666 Eigen::Matrix<std::complex<Real>,
N,
N>&
u)
682template<
class Real,
int N>
684(
const Eigen::Matrix<Real, N, N>&
m,
685 Eigen::Array<Real, N, 1>&
s,
686 Eigen::Matrix<std::complex<Real>,
N,
N>&
u,
703template<
class Real,
int N>
705(
const Eigen::Matrix<Real, N, N>&
m,
706 Eigen::Array<Real, N, 1>&
s,
707 Eigen::Matrix<std::complex<Real>,
N,
N>&
u,
709 Eigen::Array<Real, N, 1>&
u_errbd)
726template<
class Real,
int N>
728(
const Eigen::Matrix<Real, N, N>&
m,
729 Eigen::Array<Real, N, 1>&
s)
745template<
class Real,
int N>
747(
const Eigen::Matrix<Real, N, N>&
m,
748 Eigen::Array<Real, N, 1>&
s,
754template<
class Real,
class Scalar,
int M,
int N>
756(
const Eigen::Matrix<Scalar, M, N>&
m,
758 Eigen::Matrix<Scalar, M, M> *
u = 0,
759 Eigen::Matrix<Scalar, N, N> *
vh = 0,
767 Eigen::PermutationMatrix<M>
p;
773 Eigen::PermutationMatrix<N>
p;
776 vh->transpose() *=
p;
804template<
class Real,
class Scalar,
int M,
int N>
806(
const Eigen::Matrix<Scalar, M, N>&
m,
808 Eigen::Matrix<Scalar, M, M>&
u,
809 Eigen::Matrix<Scalar, N, N>&
vh)
825template<
class Real,
class Scalar,
int M,
int N>
827(
const Eigen::Matrix<Scalar, M, N>&
m,
829 Eigen::Matrix<Scalar, M, M>&
u,
830 Eigen::Matrix<Scalar, N, N>&
vh,
848template<
class Real,
class Scalar,
int M,
int N>
850(
const Eigen::Matrix<Scalar, M, N>&
m,
852 Eigen::Matrix<Scalar, M, M>&
u,
853 Eigen::Matrix<Scalar, N, N>&
vh,
872template<
class Real,
class Scalar,
int M,
int N>
874(
const Eigen::Matrix<Scalar, M, N>&
m,
891template<
class Real,
class Scalar,
int M,
int N>
893(
const Eigen::Matrix<Scalar, M, N>&
m,
900template<
class Real,
int N>
902(
const Eigen::Matrix<std::complex<Real>,
N,
N>&
m,
903 Eigen::Array<Real, N, 1>&
s,
904 Eigen::Matrix<std::complex<Real>,
N,
N> *
u = 0,
906 Eigen::Array<Real, N, 1> *
u_errbd = 0)
910 if (
u) { *
u =
u->rowwise().reverse().eval(); }
914template<
class Real,
int N>
916(
const Eigen::Matrix<Real, N, N>&
m,
917 Eigen::Array<Real, N, 1>&
s,
918 Eigen::Matrix<std::complex<Real>,
N,
N> *
u = 0,
920 Eigen::Array<Real, N, 1> *
u_errbd = 0)
923 Eigen::PermutationMatrix<N>
p;
925 std::sort(
p.indices().data(),
p.indices().data() +
p.indices().size(),
926 [&
s] (
int i,
int j) { return s[i] < s[j]; });
927#if EIGEN_VERSION_AT_LEAST(3,1,4)
928 s.matrix().transpose() *=
p;
931 Eigen::Map<Eigen::Matrix<Real, N, 1> >(
s.data()).
transpose() *=
p;
953template<
class Real,
class Scalar,
int N>
955(
const Eigen::Matrix<Scalar, N, N>&
m,
956 Eigen::Array<Real, N, 1>&
s,
957 Eigen::Matrix<std::complex<Real>,
N,
N>&
u)
973template<
class Real,
class Scalar,
int N>
975(
const Eigen::Matrix<Scalar, N, N>&
m,
976 Eigen::Array<Real, N, 1>&
s,
977 Eigen::Matrix<std::complex<Real>,
N,
N>&
u,
994template<
class Real,
class Scalar,
int N>
996(
const Eigen::Matrix<Scalar, N, N>&
m,
997 Eigen::Array<Real, N, 1>&
s,
998 Eigen::Matrix<std::complex<Real>,
N,
N>&
u,
1000 Eigen::Array<Real, N, 1>&
u_errbd)
1015template<
class Real,
class Scalar,
int N>
1017(
const Eigen::Matrix<Scalar, N, N>&
m,
1018 Eigen::Array<Real, N, 1>&
s)
1034template<
class Real,
class Scalar,
int N>
1036(
const Eigen::Matrix<Scalar, N, N>&
m,
1037 Eigen::Array<Real, N, 1>&
s,
1043template<
class Real,
class Scalar,
int M,
int N>
1045(
const Eigen::Matrix<Scalar, M, N>&
m,
1047 Eigen::Matrix<Scalar, M, M> *
u = 0,
1048 Eigen::Matrix<Scalar, N, N> *
v = 0,
1054 if (
u) {
u->transposeInPlace(); }
1080template<
class Real,
class Scalar,
int M,
int N>
1082(
const Eigen::Matrix<Scalar, M, N>&
m,
1084 Eigen::Matrix<Scalar, M, M>&
u,
1085 Eigen::Matrix<Scalar, N, N>&
v)
1101template<
class Real,
class Scalar,
int M,
int N>
1103(
const Eigen::Matrix<Scalar, M, N>&
m,
1105 Eigen::Matrix<Scalar, M, M>&
u,
1106 Eigen::Matrix<Scalar, N, N>&
v,
1124template<
class Real,
class Scalar,
int M,
int N>
1126(
const Eigen::Matrix<Scalar, M, N>&
m,
1128 Eigen::Matrix<Scalar, M, M>&
u,
1129 Eigen::Matrix<Scalar, N, N>&
v,
1148template<
class Real,
class Scalar,
int M,
int N>
1150(
const Eigen::Matrix<Scalar, M, N>&
m,
1166template<
class Real,
class Scalar,
int M,
int N>
1168(
const Eigen::Matrix<Scalar, M, N>&
m,
1201template<
class Real,
int M,
int N>
1203(
const Eigen::Matrix<Real, M, N>&
m,
1205 Eigen::Matrix<std::complex<Real>,
M,
M>&
u,
1206 Eigen::Matrix<std::complex<Real>,
N,
N>&
v)
1222template<
class Real,
int M,
int N>
1224(
const Eigen::Matrix<Real, M, N>&
m,
1226 Eigen::Matrix<std::complex<Real>,
M,
M>&
u,
1227 Eigen::Matrix<std::complex<Real>,
N,
N>&
v,
1245template<
class Real,
int M,
int N>
1247(
const Eigen::Matrix<Real, M, N>&
m,
1249 Eigen::Matrix<std::complex<Real>,
M,
M>&
u,
1250 Eigen::Matrix<std::complex<Real>,
N,
N>&
v,
1260template<
class Real,
class Scalar,
int N>
1262(
const Eigen::Matrix<Scalar, N, N>&
m,
1263 Eigen::Array<Real, N, 1>&
s,
1264 Eigen::Matrix<std::complex<Real>,
N,
N> *
u = 0,
1266 Eigen::Array<Real, N, 1> *
u_errbd = 0)
1269 if (
u) {
u->transposeInPlace(); }
1287template<
class Real,
class Scalar,
int N>
1289(
const Eigen::Matrix<Scalar, N, N>&
m,
1290 Eigen::Array<Real, N, 1>&
s,
1291 Eigen::Matrix<std::complex<Real>,
N,
N>&
u)
1307template<
class Real,
class Scalar,
int N>
1309(
const Eigen::Matrix<Scalar, N, N>&
m,
1310 Eigen::Array<Real, N, 1>&
s,
1311 Eigen::Matrix<std::complex<Real>,
N,
N>&
u,
1328template<
class Real,
class Scalar,
int N>
1330(
const Eigen::Matrix<Scalar, N, N>&
m,
1331 Eigen::Array<Real, N, 1>&
s,
1332 Eigen::Matrix<std::complex<Real>,
N,
N>&
u,
1334 Eigen::Array<Real, N, 1>&
u_errbd)
1349template<
class Real,
class Scalar,
int N>
1351(
const Eigen::Matrix<Scalar, N, N>&
m,
1352 Eigen::Array<Real, N, 1>&
s)
1368template<
class Real,
class Scalar,
int N>
1370(
const Eigen::Matrix<Scalar, N, N>&
m,
1371 Eigen::Array<Real, N, 1>&
s,
1377template<
class Real,
class Scalar,
int N>
1379(
const Eigen::Matrix<Scalar, N, N>&
m,
1380 Eigen::Array<Real, N, 1>&
w,
1381 Eigen::Matrix<Scalar, N, N> *
z = 0,
1383 Eigen::Array<Real, N, 1> *
z_errbd = 0)
1386 Eigen::PermutationMatrix<N>
p;
1388 std::sort(
p.indices().data(),
p.indices().data() +
p.indices().size(),
1389 [&
w] (
int i,
int j) { return std::abs(w[i]) < std::abs(w[j]); });
1390#if EIGEN_VERSION_AT_LEAST(3,1,4)
1391 w.matrix().transpose() *=
p;
1394 Eigen::Map<Eigen::Matrix<Real, N, 1> >(
w.data()).
transpose() *=
p;
1416template<
class Real,
class Scalar,
int N>
1418(
const Eigen::Matrix<Scalar, N, N>&
m,
1419 Eigen::Array<Real, N, 1>&
w,
1420 Eigen::Matrix<Scalar, N, N>&
z)
1436template<
class Real,
class Scalar,
int N>
1438(
const Eigen::Matrix<Scalar, N, N>&
m,
1439 Eigen::Array<Real, N, 1>&
w,
1440 Eigen::Matrix<Scalar, N, N>&
z,
1457template<
class Real,
class Scalar,
int N>
1459(
const Eigen::Matrix<Scalar, N, N>&
m,
1460 Eigen::Array<Real, N, 1>&
w,
1461 Eigen::Matrix<Scalar, N, N>&
z,
1463 Eigen::Array<Real, N, 1>&
z_errbd)
1478template<
class Real,
class Scalar,
int N>
1480(
const Eigen::Matrix<Scalar, N, N>&
m,
1481 Eigen::Array<Real, N, 1>&
w)
1497template<
class Real,
class Scalar,
int N>
1499(
const Eigen::Matrix<Scalar, N, N>&
m,
1500 Eigen::Array<Real, N, 1>&
w,
void reorder_svd_errbd(const Eigen::Matrix< Scalar, M, N > &m, Eigen::Array< Real,(((M)<(N)) ?(M) :(N)), 1 > &s, Eigen::Matrix< Scalar, M, M > *u=0, Eigen::Matrix< Scalar, N, N > *vh=0, Real *s_errbd=0, Eigen::Array< Real,(((M)<(N)) ?(M) :(N)), 1 > *u_errbd=0, Eigen::Array< Real,(((M)<(N)) ?(M) :(N)), 1 > *v_errbd=0)
void disna(const char &JOB, const Eigen::Array< Real,(((M)<(N)) ?(M) :(N)), 1 > &D, Eigen::Array< Real,(((M)<(N)) ?(M) :(N)), 1 > &SEP, int &INFO)
Template version of DDISNA from LAPACK.
void diagonalize_hermitian(const Eigen::Matrix< Scalar, N, N > &m, Eigen::Array< Real, N, 1 > &w, Eigen::Matrix< Scalar, N, N > &z)
Diagonalizes N-by-N hermitian matrix m so that.
void svd_internal(const Eigen::Matrix< Scalar, M, N > &m, Eigen::Array< Real,(((M)<(N)) ?(M) :(N)), 1 > &s, Eigen::Matrix< Scalar, M, M > *u, Eigen::Matrix< Scalar, N, N > *vh)
void svd_errbd(const Eigen::Matrix< Scalar, M, N > &m, Eigen::Array< Real,(((M)<(N)) ?(M) :(N)), 1 > &s, Eigen::Matrix< Scalar, M, M > *u=0, Eigen::Matrix< Scalar, N, N > *vh=0, Real *s_errbd=0, Eigen::Array< Real,(((M)<(N)) ?(M) :(N)), 1 > *u_errbd=0, Eigen::Array< Real,(((M)<(N)) ?(M) :(N)), 1 > *v_errbd=0)
void svd(const Eigen::Matrix< Scalar, M, N > &m, Eigen::Array< Real,(((M)<(N)) ?(M) :(N)), 1 > &s, Eigen::Matrix< Scalar, M, M > &u, Eigen::Matrix< Scalar, N, N > &vh)
Singular value decomposition of M-by-N matrix m such that.
void reorder_diagonalize_symmetric(const Eigen::Matrix< Scalar, N, N > &m, Eigen::Array< Real, N, 1 > &s, Eigen::Matrix< std::complex< Real >, N, N > &u)
Diagonalizes N-by-N symmetric matrix m so that.
void svd_eigen(const Eigen::Matrix< Scalar, M, N > &m, Eigen::Array< Real,(((M)<(N)) ?(M) :(N)), 1 > &s, Eigen::Matrix< Scalar, M, M > *u, Eigen::Matrix< Scalar, N, N > *vh)
void reorder_diagonalize_symmetric_errbd(const Eigen::Matrix< std::complex< Real >, N, N > &m, Eigen::Array< Real, N, 1 > &s, Eigen::Matrix< std::complex< Real >, N, N > *u=0, Real *s_errbd=0, Eigen::Array< Real, N, 1 > *u_errbd=0)
void fs_diagonalize_symmetric(const Eigen::Matrix< Scalar, N, N > &m, Eigen::Array< Real, N, 1 > &s, Eigen::Matrix< std::complex< Real >, N, N > &u)
Diagonalizes N-by-N symmetric matrix m so that.
void diagonalize_hermitian_errbd(const Eigen::Matrix< Scalar, N, N > &m, Eigen::Array< Real, N, 1 > &w, Eigen::Matrix< Scalar, N, N > *z=0, Real *w_errbd=0, Eigen::Array< Real, N, 1 > *z_errbd=0)
void hermitian_eigen(const Eigen::Matrix< Scalar, N, N > &m, Eigen::Array< Real, N, 1 > &w, Eigen::Matrix< Scalar, N, N > *z)
void fs_diagonalize_symmetric_errbd(const Eigen::Matrix< Scalar, N, N > &m, Eigen::Array< Real, N, 1 > &s, Eigen::Matrix< std::complex< Real >, N, N > *u=0, Real *s_errbd=0, Eigen::Array< Real, N, 1 > *u_errbd=0)
void diagonalize_symmetric_errbd(const Eigen::Matrix< std::complex< Real >, N, N > &m, Eigen::Array< Real, N, 1 > &s, Eigen::Matrix< std::complex< Real >, N, N > *u=0, Real *s_errbd=0, Eigen::Array< Real, N, 1 > *u_errbd=0)
void fs_diagonalize_hermitian_errbd(const Eigen::Matrix< Scalar, N, N > &m, Eigen::Array< Real, N, 1 > &w, Eigen::Matrix< Scalar, N, N > *z=0, Real *w_errbd=0, Eigen::Array< Real, N, 1 > *z_errbd=0)
void reorder_svd(const Eigen::Matrix< Scalar, M, N > &m, Eigen::Array< Real,(((M)<(N)) ?(M) :(N)), 1 > &s, Eigen::Matrix< Scalar, M, M > &u, Eigen::Matrix< Scalar, N, N > &vh)
Singular value decomposition of M-by-N matrix m such that.
void fs_svd(const Eigen::Matrix< Scalar, M, N > &m, Eigen::Array< Real,(((M)<(N)) ?(M) :(N)), 1 > &s, Eigen::Matrix< Scalar, M, M > &u, Eigen::Matrix< Scalar, N, N > &v)
Singular value decomposition of M-by-N matrix m such that.
void diagonalize_hermitian_internal(const Eigen::Matrix< Scalar, N, N > &m, Eigen::Array< Real, N, 1 > &w, Eigen::Matrix< Scalar, N, N > *z)
void fs_svd_errbd(const Eigen::Matrix< Scalar, M, N > &m, Eigen::Array< Real,(((M)<(N)) ?(M) :(N)), 1 > &s, Eigen::Matrix< Scalar, M, M > *u=0, Eigen::Matrix< Scalar, N, N > *v=0, Real *s_errbd=0, Eigen::Array< Real,(((M)<(N)) ?(M) :(N)), 1 > *u_errbd=0, Eigen::Array< Real,(((M)<(N)) ?(M) :(N)), 1 > *v_errbd=0)
void diagonalize_symmetric(const Eigen::Matrix< std::complex< Real >, N, N > &m, Eigen::Array< Real, N, 1 > &s, Eigen::Matrix< std::complex< Real >, N, N > &u)
Diagonalizes N-by-N complex symmetric matrix m so that.
void fs_diagonalize_hermitian(const Eigen::Matrix< Scalar, N, N > &m, Eigen::Array< Real, N, 1 > &w, Eigen::Matrix< Scalar, N, N > &z)
Diagonalizes N-by-N hermitian matrix m so that.
std::complex< Real > operator()(const std::complex< Real > &z) const