28 #include <Eigen/Eigenvalues> 29 #include <unsupported/Eigen/MatrixFunctions> 41 #define MAX_(i, j) (((i) > (j)) ? (i) : (j)) 42 #define MIN_(i, j) (((i) < (j)) ? (i) : (j)) 44 template<
class Real,
class Scalar,
int M,
int N>
46 (
const Eigen::Matrix<Scalar, M, N>& m,
47 Eigen::Array<Real,
MIN_(M, N), 1>&
s,
48 Eigen::Matrix<Scalar, M, M> *u,
49 Eigen::Matrix<Scalar, N, N> *vh)
51 Eigen::JacobiSVD<Eigen::Matrix<Scalar, M, N> >
52 svd(m, (u ? Eigen::ComputeFullU : 0) | (vh ? Eigen::ComputeFullV : 0));
53 s = svd.singularValues();
54 if (u) *u = svd.matrixU();
55 if (vh) *vh = svd.matrixV().adjoint();
58 template<
class Real,
class Scalar,
int N>
60 (
const Eigen::Matrix<Scalar, N, N>& m,
61 Eigen::Array<Real, N, 1>& w,
62 Eigen::Matrix<Scalar, N, N> *z)
64 Eigen::SelfAdjointEigenSolver<Eigen::Matrix<Scalar,N,N> >
65 es(m, z ? Eigen::ComputeEigenvectors : Eigen::EigenvaluesOnly);
67 if (z) *z = es.eigenvectors();
73 template<
int M,
int N,
class Real>
74 void disna(
const char& JOB,
const Eigen::Array<Real,
MIN_(M, N), 1>& D,
75 Eigen::Array<Real,
MIN_(M, N), 1>& SEP,
int& INFO)
87 bool DECR, EIGEN, INCR, LEFT, RIGHT, SINGUL;
89 Real ANORM, EPS, NEWGAP, OLDGAP, SAFMIN, THRESH;
94 EIGEN = std::toupper(JOB) ==
'E';
95 LEFT = std::toupper(JOB) ==
'L';
96 RIGHT = std::toupper(JOB) ==
'R';
97 SINGUL = LEFT || RIGHT;
102 if (!EIGEN && !SINGUL)
111 for (I = 0; I < K - 1; I++) {
113 INCR = INCR && D(I) <= D(I+1);
115 DECR = DECR && D(I) >= D(I+1);
117 if (SINGUL && K > 0) {
119 INCR = INCR && ZERO <= D(0);
121 DECR = DECR && D(K-1) >= ZERO;
139 SEP(0) = std::numeric_limits<Real>::max();
141 OLDGAP = std::fabs(D(1) - D(0));
143 for (I = 1; I < K - 1; I++) {
144 NEWGAP = std::fabs(D(I+1) - D(I));
145 SEP(I) = std::min(OLDGAP, NEWGAP);
151 if ((LEFT && M > N) || (RIGHT && M < N)) {
153 SEP( 0 ) = std::min(SEP( 0 ), D( 0 ));
155 SEP(K-1) = std::min(SEP(K-1), D(K-1));
164 EPS = std::numeric_limits<Real>::epsilon();
165 SAFMIN = std::numeric_limits<Real>::min();
166 ANORM = std::max(std::fabs(D(0)), std::fabs(D(K-1)));
170 THRESH = std::max(EPS*ANORM, SAFMIN);
171 for (I = 0; I < K; I++)
172 SEP(I) = std::max(SEP(I), THRESH);
176 template<
class Real,
class Scalar,
int M,
int N>
178 (
const Eigen::Matrix<Scalar, M, N>& m,
179 Eigen::Array<Real,
MIN_(M, N), 1>&
s,
180 Eigen::Matrix<Scalar, M, M> *u,
181 Eigen::Matrix<Scalar, N, N> *vh)
190 template<
class Scalar,
int M,
int N>
192 (
const Eigen::Matrix<Scalar, M, N>& m,
193 Eigen::Array<
double,
MIN_(M, N), 1>&
s,
194 Eigen::Matrix<Scalar, M, M> *u,
195 Eigen::Matrix<Scalar, N, N> *vh)
197 svd_lapack(m,
s, u, vh);
200 template<
class Scalar>
202 (
const Eigen::Matrix<Scalar, 3, 3>& m,
203 Eigen::Array<double, 3, 1>&
s,
204 Eigen::Matrix<Scalar, 3, 3> *u,
205 Eigen::Matrix<Scalar, 3, 3> *vh)
210 template<
class Scalar>
212 (
const Eigen::Matrix<Scalar, 2, 2>& m,
213 Eigen::Array<double, 2, 1>& s,
214 Eigen::Matrix<Scalar, 2, 2> *u,
215 Eigen::Matrix<Scalar, 2, 2> *vh)
220 template<
class Scalar>
222 (
const Eigen::Matrix<Scalar, 1, 1>& m,
223 Eigen::Array<double, 1, 1>& s,
224 Eigen::Matrix<Scalar, 1, 1> *u,
225 Eigen::Matrix<Scalar, 1, 1> *vh)
230 #endif // ENABLE_LAPACK 232 template<
class Real,
class Scalar,
int M,
int N>
234 (
const Eigen::Matrix<Scalar, M, N>& m,
235 Eigen::Array<Real,
MIN_(M, N), 1>& s,
236 Eigen::Matrix<Scalar, M, M> *u = 0,
237 Eigen::Matrix<Scalar, N, N> *vh = 0,
239 Eigen::Array<Real,
MIN_(M, N), 1> *u_errbd = 0,
240 Eigen::Array<Real,
MIN_(M, N), 1> *v_errbd = 0)
245 if (!s_errbd)
return;
246 const Real EPSMCH = std::numeric_limits<Real>::epsilon();
247 *s_errbd = EPSMCH * s[0];
249 Eigen::Array<Real, MIN_(M, N), 1> RCOND;
252 disna<M, N>(
'L',
s, RCOND, INFO);
253 u_errbd->fill(*s_errbd);
257 disna<M, N>(
'R',
s, RCOND, INFO);
258 v_errbd->fill(*s_errbd);
285 template<
class Real,
class Scalar,
int M,
int N>
287 (
const Eigen::Matrix<Scalar, M, N>& m,
288 Eigen::Array<Real,
MIN_(M, N), 1>& s,
289 Eigen::Matrix<Scalar, M, M>& u,
290 Eigen::Matrix<Scalar, N, N>& vh)
305 template<
class Real,
class Scalar,
int M,
int N>
307 (
const Eigen::Matrix<Scalar, M, N>& m,
308 Eigen::Array<Real,
MIN_(M, N), 1>& s,
309 Eigen::Matrix<Scalar, M, M>& u,
310 Eigen::Matrix<Scalar, N, N>& vh,
328 template<
class Real,
class Scalar,
int M,
int N>
330 (
const Eigen::Matrix<Scalar, M, N>& m,
331 Eigen::Array<Real,
MIN_(M, N), 1>& s,
332 Eigen::Matrix<Scalar, M, M>& u,
333 Eigen::Matrix<Scalar, N, N>& vh,
335 Eigen::Array<Real,
MIN_(M, N), 1>& u_errbd,
336 Eigen::Array<Real,
MIN_(M, N), 1>& v_errbd)
338 svd_errbd(m, s, &u, &vh, &s_errbd, &u_errbd, &v_errbd);
352 template<
class Real,
class Scalar,
int M,
int N>
354 (
const Eigen::Matrix<Scalar, M, N>& m,
355 Eigen::Array<Real,
MIN_(M, N), 1>& s)
370 template<
class Real,
class Scalar,
int M,
int N>
372 (
const Eigen::Matrix<Scalar, M, N>& m,
373 Eigen::Array<Real,
MIN_(M, N), 1>& s,
381 template<
class Real,
class Scalar,
int N>
383 (
const Eigen::Matrix<Scalar, N, N>& m,
384 Eigen::Array<Real, N, 1>& w,
385 Eigen::Matrix<Scalar, N, N> *z)
390 template<
class Real,
class Scalar,
int N>
392 (
const Eigen::Matrix<Scalar, N, N>& m,
393 Eigen::Array<Real, N, 1>& w,
394 Eigen::Matrix<Scalar, N, N> *z = 0,
396 Eigen::Array<Real, N, 1> *z_errbd = 0)
401 if (!w_errbd)
return;
402 const Real EPSMCH = std::numeric_limits<Real>::epsilon();
403 Real mnorm = std::max(std::abs(w[0]), std::abs(w[N-1]));
404 *w_errbd = EPSMCH * mnorm;
406 if (!z_errbd)
return;
407 Eigen::Array<Real, N, 1> RCONDZ;
409 disna<N, N>(
'E', w, RCONDZ, INFO);
410 z_errbd->fill(*w_errbd);
428 template<
class Real,
class Scalar,
int N>
430 (
const Eigen::Matrix<Scalar, N, N>& m,
431 Eigen::Array<Real, N, 1>& w,
432 Eigen::Matrix<Scalar, N, N>& z)
448 template<
class Real,
class Scalar,
int N>
450 (
const Eigen::Matrix<Scalar, N, N>& m,
451 Eigen::Array<Real, N, 1>& w,
452 Eigen::Matrix<Scalar, N, N>& z,
469 template<
class Real,
class Scalar,
int N>
471 (
const Eigen::Matrix<Scalar, N, N>& m,
472 Eigen::Array<Real, N, 1>& w,
473 Eigen::Matrix<Scalar, N, N>& z,
475 Eigen::Array<Real, N, 1>& z_errbd)
490 template<
class Real,
class Scalar,
int N>
492 (
const Eigen::Matrix<Scalar, N, N>& m,
493 Eigen::Array<Real, N, 1>& w)
509 template<
class Real,
class Scalar,
int N>
511 (
const Eigen::Matrix<Scalar, N, N>& m,
512 Eigen::Array<Real, N, 1>& w,
518 template<
class Real,
int N>
520 (
const Eigen::Matrix<std::complex<Real>, N, N>& m,
521 Eigen::Array<Real, N, 1>& s,
522 Eigen::Matrix<std::complex<Real>, N, N> *u = 0,
524 Eigen::Array<Real, N, 1> *u_errbd = 0)
530 Eigen::Matrix<std::complex<Real>, N, N> vh;
531 svd_errbd(m, s, u, &vh, s_errbd, u_errbd);
533 *u *= (u->adjoint() * vh.transpose()).sqrt().eval();
549 template<
class Real,
int N>
551 (
const Eigen::Matrix<std::complex<Real>, N, N>& m,
552 Eigen::Array<Real, N, 1>& s,
553 Eigen::Matrix<std::complex<Real>, N, N>& u)
569 template<
class Real,
int N>
571 (
const Eigen::Matrix<std::complex<Real>, N, N>& m,
572 Eigen::Array<Real, N, 1>& s,
573 Eigen::Matrix<std::complex<Real>, N, N>& u,
590 template<
class Real,
int N>
592 (
const Eigen::Matrix<std::complex<Real>, N, N>& m,
593 Eigen::Array<Real, N, 1>& s,
594 Eigen::Matrix<std::complex<Real>, N, N>& u,
596 Eigen::Array<Real, N, 1>& u_errbd)
610 template<
class Real,
int N>
612 (
const Eigen::Matrix<std::complex<Real>, N, N>& m,
613 Eigen::Array<Real, N, 1>& s)
629 template<
class Real,
int N>
631 (
const Eigen::Matrix<std::complex<Real>, N, N>& m,
632 Eigen::Array<Real, N, 1>& s,
640 std::complex<Real>
operator() (
const std::complex<Real>& z)
const {
641 return z.real() < 0 ? std::complex<Real>(0,1) :
642 std::complex<Real>(1,0);
646 template<
class Real,
int N>
648 (
const Eigen::Matrix<Real, N, N>& m,
649 Eigen::Array<Real, N, 1>& s,
650 Eigen::Matrix<std::complex<Real>, N, N> *u = 0,
652 Eigen::Array<Real, N, 1> *u_errbd = 0)
654 Eigen::Matrix<Real, N, N> z;
657 if (u) *u = z * s.template cast<std::complex<Real> >().
677 template<
class Real,
int N>
679 (
const Eigen::Matrix<Real, N, N>& m,
680 Eigen::Array<Real, N, 1>& s,
681 Eigen::Matrix<std::complex<Real>, N, N>& u)
697 template<
class Real,
int N>
699 (
const Eigen::Matrix<Real, N, N>& m,
700 Eigen::Array<Real, N, 1>& s,
701 Eigen::Matrix<std::complex<Real>, N, N>& u,
718 template<
class Real,
int N>
720 (
const Eigen::Matrix<Real, N, N>& m,
721 Eigen::Array<Real, N, 1>& s,
722 Eigen::Matrix<std::complex<Real>, N, N>& u,
724 Eigen::Array<Real, N, 1>& u_errbd)
741 template<
class Real,
int N>
743 (
const Eigen::Matrix<Real, N, N>& m,
744 Eigen::Array<Real, N, 1>& s)
760 template<
class Real,
int N>
762 (
const Eigen::Matrix<Real, N, N>& m,
763 Eigen::Array<Real, N, 1>& s,
769 template<
class Real,
class Scalar,
int M,
int N>
771 (
const Eigen::Matrix<Scalar, M, N>& m,
772 Eigen::Array<Real,
MIN_(M, N), 1>& s,
773 Eigen::Matrix<Scalar, M, M> *u = 0,
774 Eigen::Matrix<Scalar, N, N> *vh = 0,
776 Eigen::Array<Real,
MIN_(M, N), 1> *u_errbd = 0,
777 Eigen::Array<Real,
MIN_(M, N), 1> *v_errbd = 0)
779 svd_errbd(m, s, u, vh, s_errbd, u_errbd, v_errbd);
782 Eigen::PermutationMatrix<M> p;
784 p.indices().template segment<MIN_(M, N)>(0).reverseInPlace();
788 Eigen::PermutationMatrix<N> p;
790 p.indices().template segment<MIN_(M, N)>(0).reverseInPlace();
791 vh->transpose() *= p;
793 if (u_errbd) u_errbd->reverseInPlace();
794 if (v_errbd) v_errbd->reverseInPlace();
819 template<
class Real,
class Scalar,
int M,
int N>
821 (
const Eigen::Matrix<Scalar, M, N>& m,
822 Eigen::Array<Real,
MIN_(M, N), 1>& s,
823 Eigen::Matrix<Scalar, M, M>& u,
824 Eigen::Matrix<Scalar, N, N>& vh)
840 template<
class Real,
class Scalar,
int M,
int N>
842 (
const Eigen::Matrix<Scalar, M, N>& m,
843 Eigen::Array<Real,
MIN_(M, N), 1>& s,
844 Eigen::Matrix<Scalar, M, M>& u,
845 Eigen::Matrix<Scalar, N, N>& vh,
863 template<
class Real,
class Scalar,
int M,
int N>
865 (
const Eigen::Matrix<Scalar, M, N>& m,
866 Eigen::Array<Real,
MIN_(M, N), 1>& s,
867 Eigen::Matrix<Scalar, M, M>& u,
868 Eigen::Matrix<Scalar, N, N>& vh,
870 Eigen::Array<Real,
MIN_(M, N), 1>& u_errbd,
871 Eigen::Array<Real,
MIN_(M, N), 1>& v_errbd)
887 template<
class Real,
class Scalar,
int M,
int N>
889 (
const Eigen::Matrix<Scalar, M, N>& m,
890 Eigen::Array<Real,
MIN_(M, N), 1>& s)
906 template<
class Real,
class Scalar,
int M,
int N>
908 (
const Eigen::Matrix<Scalar, M, N>& m,
909 Eigen::Array<Real,
MIN_(M, N), 1>& s,
915 template<
class Real,
int N>
917 (
const Eigen::Matrix<std::complex<Real>, N, N>& m,
918 Eigen::Array<Real, N, 1>& s,
919 Eigen::Matrix<std::complex<Real>, N, N> *u = 0,
921 Eigen::Array<Real, N, 1> *u_errbd = 0)
925 if (u) *u = u->rowwise().reverse().eval();
926 if (u_errbd) u_errbd->reverseInPlace();
929 template<
class Real,
int N>
931 (
const Eigen::Matrix<Real, N, N>& m,
932 Eigen::Array<Real, N, 1>& s,
933 Eigen::Matrix<std::complex<Real>, N, N> *u = 0,
935 Eigen::Array<Real, N, 1> *u_errbd = 0)
938 Eigen::PermutationMatrix<N> p;
940 std::sort(p.indices().data(), p.indices().data() + p.indices().size(),
941 [&
s] (
int i,
int j) {
return s[i] < s[j]; });
942 #if EIGEN_VERSION_AT_LEAST(3,1,4) 943 s.matrix().transpose() *= p;
944 if (u_errbd) u_errbd->matrix().transpose() *= p;
946 Eigen::Map<Eigen::Matrix<Real, N, 1> >(s.data()).transpose() *= p;
948 Eigen::Map<Eigen::Matrix<Real, N, 1> >(u_errbd->data()).transpose()
968 template<
class Real,
class Scalar,
int N>
970 (
const Eigen::Matrix<Scalar, N, N>& m,
971 Eigen::Array<Real, N, 1>& s,
972 Eigen::Matrix<std::complex<Real>, N, N>& u)
988 template<
class Real,
class Scalar,
int N>
990 (
const Eigen::Matrix<Scalar, N, N>& m,
991 Eigen::Array<Real, N, 1>& s,
992 Eigen::Matrix<std::complex<Real>, N, N>& u,
1009 template<
class Real,
class Scalar,
int N>
1011 (
const Eigen::Matrix<Scalar, N, N>& m,
1012 Eigen::Array<Real, N, 1>& s,
1013 Eigen::Matrix<std::complex<Real>, N, N>& u,
1015 Eigen::Array<Real, N, 1>& u_errbd)
1030 template<
class Real,
class Scalar,
int N>
1032 (
const Eigen::Matrix<Scalar, N, N>& m,
1033 Eigen::Array<Real, N, 1>& s)
1049 template<
class Real,
class Scalar,
int N>
1051 (
const Eigen::Matrix<Scalar, N, N>& m,
1052 Eigen::Array<Real, N, 1>& s,
1058 template<
class Real,
class Scalar,
int M,
int N>
1060 (
const Eigen::Matrix<Scalar, M, N>& m,
1061 Eigen::Array<Real,
MIN_(M, N), 1>& s,
1062 Eigen::Matrix<Scalar, M, M> *u = 0,
1063 Eigen::Matrix<Scalar, N, N> *v = 0,
1065 Eigen::Array<Real,
MIN_(M, N), 1> *u_errbd = 0,
1066 Eigen::Array<Real,
MIN_(M, N), 1> *v_errbd = 0)
1069 if (u) u->transposeInPlace();
1095 template<
class Real,
class Scalar,
int M,
int N>
1097 (
const Eigen::Matrix<Scalar, M, N>& m,
1098 Eigen::Array<Real,
MIN_(M, N), 1>& s,
1099 Eigen::Matrix<Scalar, M, M>& u,
1100 Eigen::Matrix<Scalar, N, N>& v)
1116 template<
class Real,
class Scalar,
int M,
int N>
1118 (
const Eigen::Matrix<Scalar, M, N>& m,
1119 Eigen::Array<Real,
MIN_(M, N), 1>& s,
1120 Eigen::Matrix<Scalar, M, M>& u,
1121 Eigen::Matrix<Scalar, N, N>& v,
1139 template<
class Real,
class Scalar,
int M,
int N>
1141 (
const Eigen::Matrix<Scalar, M, N>& m,
1142 Eigen::Array<Real,
MIN_(M, N), 1>& s,
1143 Eigen::Matrix<Scalar, M, M>& u,
1144 Eigen::Matrix<Scalar, N, N>& v,
1146 Eigen::Array<Real,
MIN_(M, N), 1>& u_errbd,
1147 Eigen::Array<Real,
MIN_(M, N), 1>& v_errbd)
1149 fs_svd_errbd(m, s, &u, &v, &s_errbd, &u_errbd, &v_errbd);
1163 template<
class Real,
class Scalar,
int M,
int N>
1165 (
const Eigen::Matrix<Scalar, M, N>& m,
1166 Eigen::Array<Real,
MIN_(M, N), 1>& s)
1181 template<
class Real,
class Scalar,
int M,
int N>
1183 (
const Eigen::Matrix<Scalar, M, N>& m,
1184 Eigen::Array<Real,
MIN_(M, N), 1>& s,
1216 template<
class Real,
int M,
int N>
1218 (
const Eigen::Matrix<Real, M, N>& m,
1219 Eigen::Array<Real,
MIN_(M, N), 1>& s,
1220 Eigen::Matrix<std::complex<Real>, M, M>& u,
1221 Eigen::Matrix<std::complex<Real>, N, N>& v)
1223 fs_svd(m.template cast<std::complex<Real> >().eval(),
s, u, v);
1237 template<
class Real,
int M,
int N>
1239 (
const Eigen::Matrix<Real, M, N>& m,
1240 Eigen::Array<Real,
MIN_(M, N), 1>& s,
1241 Eigen::Matrix<std::complex<Real>, M, M>& u,
1242 Eigen::Matrix<std::complex<Real>, N, N>& v,
1245 fs_svd(m.template cast<std::complex<Real> >().eval(),
s, u, v, s_errbd);
1260 template<
class Real,
int M,
int N>
1262 (
const Eigen::Matrix<Real, M, N>& m,
1263 Eigen::Array<Real,
MIN_(M, N), 1>& s,
1264 Eigen::Matrix<std::complex<Real>, M, M>& u,
1265 Eigen::Matrix<std::complex<Real>, N, N>& v,
1267 Eigen::Array<Real,
MIN_(M, N), 1>& u_errbd,
1268 Eigen::Array<Real,
MIN_(M, N), 1>& v_errbd)
1270 fs_svd(m.template cast<std::complex<Real> >().eval(),
s, u, v,
1271 s_errbd, u_errbd, v_errbd);
1274 template<
class Real,
class Scalar,
int N>
1276 (
const Eigen::Matrix<Scalar, N, N>& m,
1277 Eigen::Array<Real, N, 1>& s,
1278 Eigen::Matrix<std::complex<Real>, N, N> *u = 0,
1280 Eigen::Array<Real, N, 1> *u_errbd = 0)
1283 if (u) u->transposeInPlace();
1301 template<
class Real,
class Scalar,
int N>
1303 (
const Eigen::Matrix<Scalar, N, N>& m,
1304 Eigen::Array<Real, N, 1>& s,
1305 Eigen::Matrix<std::complex<Real>, N, N>& u)
1321 template<
class Real,
class Scalar,
int N>
1323 (
const Eigen::Matrix<Scalar, N, N>& m,
1324 Eigen::Array<Real, N, 1>& s,
1325 Eigen::Matrix<std::complex<Real>, N, N>& u,
1342 template<
class Real,
class Scalar,
int N>
1344 (
const Eigen::Matrix<Scalar, N, N>& m,
1345 Eigen::Array<Real, N, 1>& s,
1346 Eigen::Matrix<std::complex<Real>, N, N>& u,
1348 Eigen::Array<Real, N, 1>& u_errbd)
1363 template<
class Real,
class Scalar,
int N>
1365 (
const Eigen::Matrix<Scalar, N, N>& m,
1366 Eigen::Array<Real, N, 1>& s)
1382 template<
class Real,
class Scalar,
int N>
1384 (
const Eigen::Matrix<Scalar, N, N>& m,
1385 Eigen::Array<Real, N, 1>& s,
1391 template<
class Real,
class Scalar,
int N>
1393 (
const Eigen::Matrix<Scalar, N, N>& m,
1394 Eigen::Array<Real, N, 1>& w,
1395 Eigen::Matrix<Scalar, N, N> *z = 0,
1397 Eigen::Array<Real, N, 1> *z_errbd = 0)
1400 Eigen::PermutationMatrix<N> p;
1402 std::sort(p.indices().data(), p.indices().data() + p.indices().size(),
1403 [&w] (
int i,
int j) {
return std::abs(w[i]) < std::abs(w[j]); });
1404 #if EIGEN_VERSION_AT_LEAST(3,1,4) 1405 w.matrix().transpose() *= p;
1406 if (z_errbd) z_errbd->matrix().transpose() *= p;
1408 Eigen::Map<Eigen::Matrix<Real, N, 1> >(w.data()).transpose() *= p;
1410 Eigen::Map<Eigen::Matrix<Real, N, 1> >(z_errbd->data()).transpose()
1413 if (z) *z = (*z * p).adjoint().eval();
1430 template<
class Real,
class Scalar,
int N>
1432 (
const Eigen::Matrix<Scalar, N, N>& m,
1433 Eigen::Array<Real, N, 1>& w,
1434 Eigen::Matrix<Scalar, N, N>& z)
1450 template<
class Real,
class Scalar,
int N>
1452 (
const Eigen::Matrix<Scalar, N, N>& m,
1453 Eigen::Array<Real, N, 1>& w,
1454 Eigen::Matrix<Scalar, N, N>& z,
1471 template<
class Real,
class Scalar,
int N>
1473 (
const Eigen::Matrix<Scalar, N, N>& m,
1474 Eigen::Array<Real, N, 1>& w,
1475 Eigen::Matrix<Scalar, N, N>& z,
1477 Eigen::Array<Real, N, 1>& z_errbd)
1492 template<
class Real,
class Scalar,
int N>
1494 (
const Eigen::Matrix<Scalar, N, N>& m,
1495 Eigen::Array<Real, N, 1>& w)
1511 template<
class Real,
class Scalar,
int N>
1513 (
const Eigen::Matrix<Scalar, N, N>& m,
1514 Eigen::Array<Real, N, 1>& w,
1520 using V2 = Eigen::Vector2d;
1535 const RM22& m1 = RM22::Zero(),
1536 const RM22& m2 = RM22::Zero(),
1537 const RM22& m3 = RM22::Zero());
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)
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)
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)
void reorder_svd_errbd(const Eigen::Matrix< Scalar, M, N > &m, Eigen::Array< Real, MIN_(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, MIN_(M, N), 1 > *u_errbd=0, Eigen::Array< Real, MIN_(M, N), 1 > *v_errbd=0)
void diagonalize_hermitian_internal(const Eigen::Matrix< Scalar, N, N > &m, Eigen::Array< Real, N, 1 > &w, Eigen::Matrix< Scalar, N, N > *z)
void svd_errbd(const Eigen::Matrix< Scalar, M, N > &m, Eigen::Array< Real, MIN_(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, MIN_(M, N), 1 > *u_errbd=0, Eigen::Array< Real, MIN_(M, N), 1 > *v_errbd=0)
void svd_internal(const Eigen::Matrix< Scalar, M, N > &m, Eigen::Array< Real, MIN_(M, N), 1 > &s, Eigen::Matrix< Scalar, M, M > *u, Eigen::Matrix< Scalar, N, N > *vh)
void svd_eigen(const Eigen::Matrix< Scalar, M, N > &m, Eigen::Array< Real, MIN_(M, N), 1 > &s, Eigen::Matrix< Scalar, M, M > *u, Eigen::Matrix< Scalar, N, N > *vh)
std::complex< Real > operator()(const std::complex< Real > &z) const
void disna(const char &JOB, const Eigen::Array< Real, MIN_(M, N), 1 > &D, Eigen::Array< Real, MIN_(M, N), 1 > &SEP, int &INFO)
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_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 diagonalize_hermitian(const Eigen::Matrix< Scalar, N, N > &m, Eigen::Array< Real, N, 1 > &w, Eigen::Matrix< Scalar, N, N > &z)
void svd(const Eigen::Matrix< Scalar, M, N > &m, Eigen::Array< Real, MIN_(M, N), 1 > &s, Eigen::Matrix< Scalar, M, M > &u, Eigen::Matrix< Scalar, N, N > &vh)
void reorder_svd(const Eigen::Matrix< Scalar, M, N > &m, Eigen::Array< Real, MIN_(M, N), 1 > &s, Eigen::Matrix< Scalar, M, M > &u, Eigen::Matrix< Scalar, N, N > &vh)
void fs_diagonalize_hermitian(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, MIN_(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, MIN_(M, N), 1 > *u_errbd=0, Eigen::Array< Real, MIN_(M, N), 1 > *v_errbd=0)
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)
HimalayaErrorMessage [s_] s
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)
std::tuple< V2, V2, V2, V2 > fs_diagonalize_hermitian_perturbatively(const RM22 &m0, const RM22 &m1, const RM22 &m2, const RM22 &m3)
Eigen::Matrix2d RM22
real 2x2 matrix
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 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)
Eigen::Vector2d V2
real 2-vector
void fs_svd(const Eigen::Matrix< Scalar, M, N > &m, Eigen::Array< Real, MIN_(M, N), 1 > &s, Eigen::Matrix< Scalar, M, M > &u, Eigen::Matrix< Scalar, N, N > &v)