12namespace Linear_Algebra {
100 int n =
A.num_cols();
114 for (
int j = 0; j < n; j++)
117 for (
int k = 0; k < j; k++)
120 for (
int i = 0; i < k; i++)
122 s += L_[k][i]*L_[j][i];
124 L_[j][k] = s = (
A[j][k] - s)/L_[k][k];
126 isspd = isspd && (
A[k][j] ==
A[j][k]);
129 isspd = isspd && (d >
Real(0.0));
131 for (
int k = j+1; k < n; k++)
133 L_[j][k] =
Real(0.0);
151 int n = L_.num_rows();
160 for (
int k = 0; k < n; k++)
162 for (
int i = 0; i < k; i++)
163 x[k] -=
x[i]*L_[k][i];
169 for (
int k = n-1; k >= 0; k--)
171 for (
int i = k+1; i < n; i++)
172 x[k] -=
x[i]*L_[i][k];
193 int n = L_.num_rows();
194 if (
B.num_rows() != n)
199 int nx =
B.num_cols();
202 for (
int j=0; j<
nx; j++)
204 for (
int k = 0; k < n; k++)
206 for (
int i = 0; i < k; i++)
207 X[k][j] -=
X[i][j]*L_[k][i];
213 for (
int j=0; j<
nx; j++)
215 for (
int k = n-1; k >= 0; k--)
217 for (
int i = k+1; i < n; i++)
218 X[k][j] -=
X[i][j]*L_[i][k];
321 for (
int j = 0; j < n; j++) {
327 for (
int i = n-1; i > 0; i--) {
333 for (
int k = 0; k < i; k++) {
338 for (
int j = 0; j < i; j++) {
347 for (
int k = 0; k < i; k++) {
359 for (
int j = 0; j < i; j++) {
365 for (
int j = 0; j < i; j++) {
368 g = e[j] + V[j][j] *
f;
369 for (
int k = j+1; k <= i-1; k++) {
376 for (
int j = 0; j < i; j++) {
381 for (
int j = 0; j < i; j++) {
384 for (
int j = 0; j < i; j++) {
387 for (
int k = j; k <= i-1; k++) {
388 V[k][j] -= (
f * e[k] +
g * d[k]);
399 for (
int i = 0; i < n-1; i++) {
403 if (
h !=
Real(0.0)) {
404 for (
int k = 0; k <= i; k++) {
405 d[k] = V[k][i+1] /
h;
407 for (
int j = 0; j <= i; j++) {
409 for (
int k = 0; k <= i; k++) {
410 g += V[k][i+1] * V[k][j];
412 for (
int k = 0; k <= i; k++) {
417 for (
int k = 0; k <= i; k++) {
418 V[k][i+1] =
Real(0.0);
421 for (
int j = 0; j < n; j++) {
423 V[n-1][j] =
Real(0.0);
425 V[n-1][n-1] =
Real(1.0);
438 for (
int i = 1; i < n; i++) {
446 for (
int l = 0;
l < n;
l++) {
473 Real p = (d[
l+1] -
g) / (2.0 * e[
l]);
478 d[
l] = e[
l] / (
p +
r);
479 d[
l+1] = e[
l] * (
p +
r);
482 for (
int i =
l+2; i < n; i++) {
496 for (
int i = m-1; i >=
l; i--) {
506 p =
c * d[i] - s *
g;
507 d[i+1] =
h + s * (
c *
g + s * d[i]);
511 for (
int k = 0; k < n; k++) {
513 V[k][i+1] = s * V[k][i] +
c *
h;
514 V[k][i] =
c * V[k][i] - s *
h;
531 for (
int i = 0; i < n-1; i++) {
534 for (
int j = i+1; j < n; j++) {
543 for (
int j = 0; j < n; j++) {
564 for (
int m =
low+1; m <=
high-1; m++) {
569 for (
int i = m; i <=
high; i++) {
577 for (
int i =
high; i >= m; i--) {
578 ort[i] = H[i][m-1]/
scale;
579 h += ort[i] * ort[i];
591 for (
int j = m; j < n; j++) {
593 for (
int i =
high; i >= m; i--) {
597 for (
int i = m; i <=
high; i++) {
602 for (
int i = 0; i <=
high; i++) {
604 for (
int j =
high; j >= m; j--) {
608 for (
int j = m; j <=
high; j++) {
612 ort[m] =
scale*ort[m];
619 for (
int i = 0; i < n; i++) {
620 for (
int j = 0; j < n; j++) {
621 V[i][j] = (i == j ?
Real(1.0) :
Real(0.0));
625 for (
int m =
high-1; m >=
low+1; m--) {
626 if (H[m][m-1] !=
Real(0.0)) {
627 for (
int i = m+1; i <=
high; i++) {
630 for (
int j = m; j <=
high; j++) {
632 for (
int i = m; i <=
high; i++) {
633 g += ort[i] * V[i][j];
636 g = (
g / ort[m]) / H[m][m-1];
637 for (
int i = m; i <=
high; i++) {
638 V[i][j] +=
g * ort[i];
654 cdivr = (
xr +
r*
xi)/d;
655 cdivi = (
xi -
r*
xr)/d;
659 cdivr = (
r*
xr +
xi)/d;
660 cdivi = (
r*
xi -
xr)/d;
687 for (
int i = 0; i <
nn; i++) {
692 for (
int j =
max(i-1,0); j <
nn; j++) {
707 if (s ==
Real(0.0)) {
728 }
else if (
l == n-1) {
729 w = H[n][n-1] * H[n-1][n];
730 p = (H[n-1][n-1] - H[n][n]) / 2.0;
734 H[n-1][n-1] = H[n-1][n-1] +
exshift;
747 if (
z !=
Real(0.0)) {
762 for (
int j = n-1; j <
nn; j++) {
764 H[n-1][j] =
q *
z +
p * H[n][j];
765 H[n][j] =
q * H[n][j] -
p *
z;
770 for (
int i = 0; i <= n; i++) {
772 H[i][n-1] =
q *
z +
p * H[i][n];
773 H[i][n] =
q * H[i][n] -
p *
z;
778 for (
int i =
low; i <=
high; i++) {
780 V[i][n-1] =
q *
z +
p * V[i][n];
781 V[i][n] =
q * V[i][n] -
p *
z;
806 w = H[n][n-1] * H[n-1][n];
813 for (
int i =
low; i <= n; i++) {
816 s =
abs(H[n][n-1]) +
abs(H[n-1][n-2]);
831 s =
x -
w / ((
y -
x) / 2.0 + s);
832 for (
int i =
low; i <= n; i++) {
849 p = (
r * s -
w) / H[m+1][m] + H[m][m+1];
850 q = H[m+1][m+1] -
z -
r - s;
861 abs(H[m+1][m+1])))) {
867 for (
int i = m+2; i <= n; i++) {
868 H[i][i-2] =
Real(0.0);
870 H[i][i-3] =
Real(0.0);
876 for (
int k = m; k <= n-1; k++) {
883 if (
x !=
Real(0.0)) {
889 if (
x ==
Real(0.0)) {
900 H[k][k-1] = -H[k][k-1];
911 for (
int j = k; j <
nn; j++) {
912 p = H[k][j] +
q * H[k+1][j];
914 p =
p +
r * H[k+2][j];
915 H[k+2][j] = H[k+2][j] -
p *
z;
917 H[k][j] = H[k][j] -
p *
x;
918 H[k+1][j] = H[k+1][j] -
p *
y;
923 for (
int i = 0; i <=
min(n,k+3); i++) {
924 p =
x * H[i][k] +
y * H[i][k+1];
926 p =
p +
z * H[i][k+2];
927 H[i][k+2] = H[i][k+2] -
p *
r;
929 H[i][k] = H[i][k] -
p;
930 H[i][k+1] = H[i][k+1] -
p *
q;
935 for (
int i =
low; i <=
high; i++) {
936 p =
x * V[i][k] +
y * V[i][k+1];
938 p =
p +
z * V[i][k+2];
939 V[i][k+2] = V[i][k+2] -
p *
r;
941 V[i][k] = V[i][k] -
p;
942 V[i][k+1] = V[i][k+1] -
p *
q;
955 for (n =
nn-1; n >= 0; n--) {
964 for (
int i = n-1; i >= 0; i--) {
967 for (
int j =
l; j <= n; j++) {
968 r =
r + H[i][j] * H[j][n];
970 if (e[i] <
Real(0.0)) {
975 if (e[i] ==
Real(0.0)) {
976 if (
w !=
Real(0.0)) {
987 q = (d[i] -
p) * (d[i] -
p) + e[i] * e[i];
988 t = (
x * s -
z *
r) /
q;
991 H[i+1][n] = (-
r -
w *
t) /
x;
993 H[i+1][n] = (-s -
y *
t) /
z;
1000 if ((
eps *
t) *
t > 1) {
1001 for (
int j = i; j <= n; j++) {
1002 H[j][n] = H[j][n] /
t;
1015 if (
abs(H[n][n-1]) >
abs(H[n-1][n])) {
1016 H[n-1][n-1] =
q / H[n][n-1];
1017 H[n-1][n] = -(H[n][n] -
p) / H[n][n-1];
1019 cdiv(
Real(0.0),-H[n-1][n],H[n-1][n-1]-
p,
q);
1020 H[n-1][n-1] = cdivr;
1023 H[n][n-1] =
Real(0.0);
1024 H[n][n] =
Real(1.0);
1025 for (
int i = n-2; i >= 0; i--) {
1029 for (
int j =
l; j <= n; j++) {
1030 ra =
ra + H[i][j] * H[j][n-1];
1031 sa =
sa + H[i][j] * H[j][n];
1035 if (e[i] <
Real(0.0)) {
1051 vr = (d[i] -
p) * (d[i] -
p) + e[i] * e[i] -
q *
q;
1052 vi = (d[i] -
p) * 2.0 *
q;
1061 H[i+1][n-1] = (-
ra -
w * H[i][n-1] +
q * H[i][n]) /
x;
1062 H[i+1][n] = (-
sa -
w * H[i][n] -
q * H[i][n-1]) /
x;
1064 cdiv(-
r-
y*H[i][n-1],-s-
y*H[i][n],
z,
q);
1065 H[i+1][n-1] = cdivr;
1073 if ((
eps *
t) *
t > 1) {
1074 for (
int j = i; j <= n; j++) {
1075 H[j][n-1] = H[j][n-1] /
t;
1076 H[j][n] = H[j][n] /
t;
1086 for (
int i = 0; i <
nn; i++) {
1088 for (
int j = i; j <
nn; j++) {
1096 for (
int j =
nn-1; j >=
low; j--) {
1097 for (
int i =
low; i <=
high; i++) {
1100 z =
z + V[i][k] * H[k][j];
1121 for (
int j = 0; (j < n) && issymmetric; j++) {
1122 for (
int i = 0; (i < n) && issymmetric; i++) {
1123 issymmetric = (
A[i][j] ==
A[j][i]);
1128 for (
int i = 0; i < n; i++) {
1129 for (
int j = 0; j < n; j++) {
1144 for (
int j = 0; j < n; j++) {
1145 for (
int i = 0; i < n; i++) {
1223 for (
int i = 0; i < n; i++) {
1224 for (
int j = 0; j < n; j++) {
1225 D[i][j] =
Real(0.0);
1230 }
else if (e[i] < 0) {
1250template <
class Real>
1271 for (
int j =
j0; j <=
j1; j++)
1272 X[i][j-
j0] =
A[piv[i]][j];
1309 for (
int i = 0; i < m; i++) {
1318 for (
int j = 0; j < n; j++) {
1322 for (
int i = 0; i < m; i++) {
1328 for (
int i = 0; i < m; i++) {
1334 double s =
Real(0.0);
1335 for (
int k = 0; k <
kmax; k++) {
1345 for (
int i = j+1; i < m; i++) {
1352 for (k = 0; k < n; k++) {
1353 double t = LU_[
p][k];
1354 LU_[
p][k] = LU_[j][k];
1365 if ((j < m) && (LU_[j][j] !=
Real(0.0))) {
1366 for (
int i = j+1; i < m; i++) {
1367 LU_[i][j] /= LU_[j][j];
1380 for (
int j = 0; j < n; j++) {
1393 for (
int i = 0; i < m; i++) {
1394 for (
int j = 0; j < n; j++) {
1396 L_[i][j] = LU_[i][j];
1397 }
else if (i == j) {
1398 L_[i][j] =
Real(1.0);
1400 L_[i][j] =
Real(0.0);
1413 for (
int i = 0; i < n; i++) {
1414 for (
int j = 0; j < n; j++) {
1416 U_[i][j] = LU_[i][j];
1443 for (
int j = 0; j < n; j++) {
1460 if (
B.num_rows() != m) {
1468 int nx =
B.num_cols();
1474 for (
int k = 0; k < n; k++) {
1475 for (
int i = k+1; i < n; i++) {
1476 for (
int j = 0; j <
nx; j++) {
1477 X[i][j] -=
X[k][j]*LU_[i][k];
1482 for (
int k = n-1; k >= 0; k--) {
1483 for (
int j = 0; j <
nx; j++) {
1484 X[k][j] /= LU_[k][k];
1486 for (
int i = 0; i < k; i++) {
1487 for (
int j = 0; j <
nx; j++) {
1488 X[i][j] -=
X[k][j]*LU_[i][k];
1521 for (
int k = 0; k < n; k++) {
1522 for (
int i = k+1; i < n; i++) {
1523 x[i] -=
x[k]*LU_[i][k];
1528 for (
int k = n-1; k >= 0; k--) {
1530 for (
int i = 0; i < k; i++)
1531 x[i] -=
x[k]*LU_[i][k];
1564template <
class Real>
1602 for (k = 0; k < n; k++) {
1605 for (i = k; i < m; i++) {
1611 if (QR_[k][k] < 0) {
1614 for (i = k; i < m; i++) {
1617 QR_[k][k] += Real(1.0);
1620 for (j = k+1; j < n; j++) {
1622 for (i = k; i < m; i++) {
1623 s += QR_[i][k]*QR_[i][j];
1626 for (i = k; i < m; i++) {
1627 QR_[i][j] += s*QR_[i][k];
1643 for (
int j = 0; j < n; j++)
1667 for (
int i = 0; i < m; i++)
1669 for (
int j = 0; j < n; j++)
1672 H[i][j] = QR_[i][j];
1674 H[i][j] =
Real(0.0);
1690 for (
int i = 0; i < n; i++) {
1691 for (
int j = 0; j < n; j++) {
1693 R[i][j] = QR_[i][j];
1694 }
else if (i == j) {
1697 R[i][j] =
Real(0.0);
1717 for (k = n-1; k >= 0; k--) {
1718 for (i = 0; i < m; i++) {
1719 Q[i][k] =
Real(0.0);
1721 Q[k][k] =
Real(1.0);
1722 for (j = k; j < n; j++) {
1723 if (QR_[k][k] != 0) {
1725 for (i = k; i < m; i++) {
1726 s += QR_[i][k]*
Q[i][j];
1729 for (i = k; i < m; i++) {
1730 Q[i][j] += s*QR_[i][k];
1759 for (
int k = 0; k < n; k++)
1762 for (
int i = k; i < m; i++)
1764 s += QR_[i][k]*
x[i];
1767 for (
int i = k; i < m; i++)
1769 x[i] += s*QR_[i][k];
1773 for (
int k = n-1; k >= 0; k--)
1776 for (
int i = 0; i < k; i++) {
1777 x[i] -=
x[k]*QR_[i][k];
1784 for (
int i=0; i<n; i++)
1799 if (
B.num_rows() != m)
1807 int nx =
B.num_cols();
1812 for (k = 0; k < n; k++) {
1813 for (j = 0; j <
nx; j++) {
1815 for (i = k; i < m; i++) {
1816 s += QR_[i][k]*
X[i][j];
1819 for (i = k; i < m; i++) {
1820 X[i][j] += s*QR_[i][k];
1825 for (k = n-1; k >= 0; k--) {
1826 for (j = 0; j <
nx; j++) {
1827 X[k][j] /= Rdiag[k];
1829 for (i = 0; i < k; i++) {
1830 for (j = 0; j <
nx; j++) {
1831 X[i][j] -=
X[k][j]*QR_[i][k];
1840 for (j=0; j<
nx; j++)
1867template <
class Real>
1907 for (i = k; i < m; i++) {
1908 s[k] =
hypot(s[k],
A[i][k]);
1910 if (s[k] !=
Real(0.0)) {
1911 if (
A[k][k] <
Real(0.0)) {
1914 for (i = k; i < m; i++) {
1917 A[k][k] +=
Real(1.0);
1921 for (j = k+1; j < n; j++) {
1922 if ((k <
nct) && (s[k] !=
Real(0.0))) {
1927 for (i = k; i < m; i++) {
1928 t +=
A[i][k]*
A[i][j];
1931 for (i = k; i < m; i++) {
1932 A[i][j] +=
t*
A[i][k];
1946 for (i = k; i < m; i++) {
1956 for (i = k+1; i < n; i++) {
1957 e[k] =
hypot(e[k],e[i]);
1959 if (e[k] !=
Real(0.0)) {
1960 if (e[k+1] <
Real(0.0)) {
1963 for (i = k+1; i < n; i++) {
1966 e[k+1] +=
Real(1.0);
1969 if ((k+1 < m) & (e[k] !=
Real(0.0))) {
1973 for (i = k+1; i < m; i++) {
1976 for (j = k+1; j < n; j++) {
1977 for (i = k+1; i < m; i++) {
1978 work[i] += e[j]*
A[i][j];
1981 for (j = k+1; j < n; j++) {
1982 double t = -e[j]/e[k+1];
1983 for (i = k+1; i < m; i++) {
1993 for (i = k+1; i < n; i++) {
2017 for (j =
nct; j <
nu; j++) {
2018 for (i = 0; i < m; i++) {
2019 U[i][j] =
Real(0.0);
2021 U[j][j] =
Real(1.0);
2023 for (k =
nct-1; k >= 0; k--) {
2024 if (s[k] !=
Real(0.0)) {
2025 for (j = k+1; j <
nu; j++) {
2027 for (i = k; i < m; i++) {
2028 t += U[i][k]*U[i][j];
2031 for (i = k; i < m; i++) {
2032 U[i][j] +=
t*U[i][k];
2035 for (i = k; i < m; i++ ) {
2038 U[k][k] =
Real(1.0) + U[k][k];
2039 for (i = 0; i < k-1; i++) {
2040 U[i][k] =
Real(0.0);
2043 for (i = 0; i < m; i++) {
2044 U[i][k] =
Real(0.0);
2046 U[k][k] =
Real(1.0);
2054 for (k = n-1; k >= 0; k--) {
2055 if ((k <
nrt) & (e[k] !=
Real(0.0))) {
2056 for (j = k+1; j <
nu; j++) {
2058 for (i = k+1; i < n; i++) {
2059 t += V[i][k]*V[i][j];
2062 for (i = k+1; i < n; i++) {
2063 V[i][j] +=
t*V[i][k];
2067 for (i = 0; i < n; i++) {
2068 V[i][k] =
Real(0.0);
2070 V[k][k] =
Real(1.0);
2078 double eps =
pow(2.0,-52.0);
2095 for (k =
p-2; k >= -1; k--) {
2108 for (
ks =
p-1;
ks >= k;
ks--) {
2112 double t = (
ks !=
p ?
abs(e[
ks]) : 0.) +
2113 (
ks != k+1 ?
abs(e[
ks-1]) : 0.);
2121 }
else if (
ks ==
p-1) {
2139 for (j =
p-2; j >= k; j--) {
2149 for (i = 0; i < n; i++) {
2150 t =
cs*V[i][j] +
sn*V[i][
p-1];
2151 V[i][
p-1] = -
sn*V[i][j] +
cs*V[i][
p-1];
2164 for (j = k; j <
p; j++) {
2172 for (i = 0; i < m; i++) {
2173 t =
cs*U[i][j] +
sn*U[i][k-1];
2174 U[i][k-1] = -
sn*U[i][j] +
cs*U[i][k-1];
2201 if (
b <
Real(0.0)) {
2211 for (j = k; j <
p-1; j++) {
2218 f =
cs*s[j] +
sn*e[j];
2219 e[j] =
cs*e[j] -
sn*s[j];
2223 for (i = 0; i < n; i++) {
2224 t =
cs*V[i][j] +
sn*V[i][j+1];
2225 V[i][j+1] = -
sn*V[i][j] +
cs*V[i][j+1];
2233 f =
cs*e[j] +
sn*s[j+1];
2234 s[j+1] = -
sn*e[j] +
cs*s[j+1];
2237 if (
wantu && (j < m-1)) {
2238 for (i = 0; i < m; i++) {
2239 t =
cs*U[i][j] +
sn*U[i][j+1];
2240 U[i][j+1] = -
sn*U[i][j] +
cs*U[i][j+1];
2256 if (s[k] <=
Real(0.0)) {
2257 s[k] = (s[k] <
Real(0.0) ? -s[k] :
Real(0.0));
2259 for (i = 0; i <=
pp; i++) {
2268 if (s[k] >= s[k+1]) {
2274 if (
wantv && (k < n-1)) {
2275 for (i = 0; i < n; i++) {
2276 t = V[i][k+1]; V[i][k+1] = V[i][k]; V[i][k] =
t;
2279 if (
wantu && (k < m-1)) {
2280 for (i = 0; i < m; i++) {
2281 t = U[i][k+1]; U[i][k+1] = U[i][k]; U[i][k] =
t;
2301 for (
int i=0; i<m; i++)
2302 for (
int j=0; j<
minm; j++)
2327 for (
int i = 0; i < n; i++) {
2328 for (
int j = 0; j < n; j++) {
2329 A[i][j] =
Real(0.0);
2344 return s[0]/s[
min(m,n)-1];
2353 double eps =
pow(2.0,-52.0);
2356 for (
int i = 0; i < s.dim(); i++) {
Definition tnt_array1d.h:40
Definition tnt_linalg.h:51
Matrix< Real > getL() const
Definition tnt_linalg.h:83
int is_spd() const
Definition tnt_linalg.h:74
Vector< Real > solve(const Vector< Real > &B)
Definition tnt_linalg.h:149
Definition tnt_linalg.h:284
void getD(Matrix< Real > &D)
Definition tnt_linalg.h:1221
void getImagEigenvalues(Vector< Real > &e_)
Definition tnt_linalg.h:1182
void getRealEigenvalues(Vector< Real > &d_)
Definition tnt_linalg.h:1172
void getV(Matrix< Real > &V_)
Definition tnt_linalg.h:1163
Eigenvalue(const Matrix< Real > &A)
Definition tnt_linalg.h:1114
Definition tnt_linalg.h:1252
int isNonsingular()
Definition tnt_linalg.h:1379
Vector< Real > solve(const Vector< Real > &b)
Definition tnt_linalg.h:1505
Matrix< Real > getU()
Definition tnt_linalg.h:1411
Vector< int > getPivot()
Definition tnt_linalg.h:1429
Matrix< Real > getL()
Definition tnt_linalg.h:1391
Matrix< Real > solve(const Matrix< Real > &B)
Definition tnt_linalg.h:1455
LU(const Matrix< Real > &A)
Definition tnt_linalg.h:1301
Real det()
Definition tnt_linalg.h:1438
Definition tnt_linalg.h:1565
Matrix< Real > getQ() const
Definition tnt_linalg.h:1712
Matrix< Real > getR() const
Definition tnt_linalg.h:1687
int isFullRank() const
Definition tnt_linalg.h:1641
Matrix< Real > getHouseholder(void) const
Definition tnt_linalg.h:1660
Matrix< Real > solve(const Matrix< Real > &B) const
Definition tnt_linalg.h:1797
Vector< Real > solve(const Vector< Real > &b) const
Definition tnt_linalg.h:1746
Definition tnt_linalg.h:1869
int rank()
Definition tnt_linalg.h:2351
double cond()
Definition tnt_linalg.h:2343
void getSingularValues(Vector< Real > &x)
Definition tnt_linalg.h:2316
double norm2()
Definition tnt_linalg.h:2337
void getS(Matrix< Real > &A)
Definition tnt_linalg.h:2325
Definition tnt_array1d.h:36
double norm(const Matrix< T > &A)
Definition tnt_matrix.h:996
Real hypot(const Real &a, const Real &b)
Definition tnt_math_utils.h:21