27 #define MAX(a, b) ((a) > (b) ? (a) : (b))
38 static void tred2(
double V[n][n],
double d[n],
double e[n])
47 for (j = 0; j < n; j++) {
53 for (i = n - 1; i > 0; i--) {
58 for (k = 0; k < i; k++) {
59 scale = scale + fabs(d[k]);
63 for (j = 0; j < i; j++) {
70 for (k = 0; k < i; k++) {
82 for (j = 0; j < i; j++) {
88 for (j = 0; j < i; j++) {
91 g = e[j] + V[j][j] * f;
92 for (k = j + 1; k <= i - 1; k++) {
99 for (j = 0; j < i; j++) {
104 for (j = 0; j < i; j++) {
107 for (j = 0; j < i; j++) {
110 for (k = j; k <= i - 1; k++) {
111 V[k][j] -= (f * e[k] + g * d[k]);
122 for (i = 0; i < n - 1; i++) {
123 V[n - 1][i] = V[i][i];
125 const double h = d[i + 1];
127 for (k = 0; k <= i; k++) {
128 d[k] = V[k][i + 1] / h;
130 for (j = 0; j <= i; j++) {
132 for (k = 0; k <= i; k++) {
133 g += V[k][i + 1] * V[k][j];
135 for (k = 0; k <= i; k++) {
140 for (k = 0; k <= i; k++) {
144 for (j = 0; j < n; j++) {
148 V[n - 1][n - 1] = 1.0;
154 static void tql2(
double V[n][n],
double d[n],
double e[n])
161 double g, p, r, dl1, h, f, tst1, eps;
162 double c, c2, c3, el1, s, s2;
164 for (i = 1; i < n; i++) {
171 eps = pow(2.0, -52.0);
172 for (l = 0; l < n; l++) {
174 tst1 = MAX(tst1, fabs(d[l]) + fabs(e[l]));
177 if (fabs(e[m]) <= eps * tst1) {
194 p = (d[l + 1] - g) / (2.0 * e[l]);
199 d[l] = e[l] / (p + r);
200 d[l + 1] = e[l] * (p + r);
203 for (i = l + 2; i < n; i++) {
217 for (i = m - 1; i >= l; i--) {
227 p = c * d[i] - s * g;
228 d[i + 1] = h + s * (c * g + s * d[i]);
232 for (k = 0; k < n; k++) {
234 V[k][i + 1] = s * V[k][i] + c * h;
235 V[k][i] = c * V[k][i] - s * h;
238 p = -s * s2 * c3 * el1 * e[l] / dl1;
243 }
while (fabs(e[l]) > eps * tst1);
250 for (i = 0; i < n - 1; i++) {
253 for (j = i + 1; j < n; j++) {
262 for (j = 0; j < n; j++) {
271 void eigen_decomposition(
double A[n][n],
double V[n][n],
double d[n])
275 for (i = 0; i < n; i++) {
276 for (j = 0; j < n; j++) {