17 #define REPORT { static ExeCounter ExeCount(__LINE__,17); ++ExeCount; } 27 Tracer et(
"Evalue(tred2)");
35 for (i=
n-1; i > 0; i--)
38 int k = i-1;
Real* zik = z + i*
n;
39 while (k--) g +=
square(*zik++);
46 Z.
element(i,i-1) = f-g; f = 0.0;
51 *zji = (*zij++)/h; g = 0.0;
52 Real* zjk = z + j*
n; zik = z + i*
n;
53 k = j;
while (k--) g += *zjk++ * (*zik++);
56 { g += *zjk * (*zik++);
if (!(--k))
break; zjk +=
n; }
57 *ej++ = g/h; f += g * (*zji); zji +=
n;
59 Real hh = f / (h + h); zij = z + i*
n; ej = E.
Store();
62 f = *zij++; g = *ej - hh * f; *ej++ = g;
65 while (k--) *zjk++ -= ( f*(*ek++) + g*(*zik++) );
77 for (
int j=0; j<i; j++)
83 { g += *zik++ * (*zkj);
if (!(--k))
break; zkj +=
n; }
84 Real* zki = z + i; zkj = z + j;
87 { *zkj -= g * (*zki);
if (!(--k))
break; zkj +=
n; zki +=
n; }
93 { *zij++ = 0.0; *zji = 0.0;
if (!(--j))
break; zji +=
n; }
94 D.
element(i) = *zij; *zij = 1.0;
100 Tracer et(
"Evalue(tql2)");
102 Real eps = FloatingPointPrecision::Epsilon();
110 Real h = eps * ( fabs(dl) + fabs(el) );
111 if (b < h) {
REPORT b = h; }
113 for (m=l; m<
n; m++)
if (fabs(E.
element(m)) <= b)
break;
117 if (m==l) {
REPORT test =
true;
break; }
119 Real g = dl;
Real p = (dl1-g) / (2.0*el);
Real r = sqrt(p*p + 1.0);
120 dl = el / (p < 0.0 ? p-r : p+r);
Real h = g - dl; f += h;
121 Real* dlx = &dl1; i =
n-l-1;
while (i--) *dlx++ -= h;
124 for (i=m-1; i>=l; i--)
128 g = c * ei; h = c * p;
129 if ( fabs(p) >= fabs(ei))
132 c = ei / p; r = sqrt(c*c + 1.0);
133 ei1 = s*p*r; s = c/r; c = 1.0/r;
138 c = p / ei; r = sqrt(c*c + 1.0);
139 ei1 = s * ei * r; s = 1.0/r; c /= r;
141 p = c * di - s*g; D.
element(i+1) = h + s * (c*g + s*di);
143 Real* zki = z + i;
Real* zki1 = zki + 1;
int k =
n;
147 h = *zki1; *zki1 = s*(*zki) + c*h; *zki = c*(*zki) - s*h;
153 if (fabs(el) <= b) {
REPORT; test =
true;
break; }
182 Tracer et(
"Evalue(tred3)");
188 for (
int i =
n-1; i >= 0; i--)
191 Real* d = D.
Store();
Real* a =
A.Store() + (i*(i+1))/2;
int k = i;
192 while (k--) { f = *a++; *d++ = f; h +=
square(f); }
193 if (h <= tol) {
REPORT *(--ei) = 0.0; h = 0.0; }
197 Real g =
sign(-sqrt(h), f); *(--ei) = g; h -= f*g;
198 f -= g; *(d-1) = f; *(a-1) = f; f = 0.0;
200 for (j = 0; j < i; j++)
204 while (k--) g += *ak++ * *dk++;
206 if (k)
for (;;) { g += *ak * *dk++;
if (!(--k))
break; ak += ++l; }
207 g /= h; *ej++ = g; f += g * *dj++;
209 Real hh = f / (2 * h);
Real* ak =
A.Store();
211 for (j = 0; j < i; j++)
213 f = *dj++; g = *ej - hh * f; *ej++ = g;
215 while (k--) { *ak++ -= (f * *ek++ + g * *dk++); }
224 Tracer et(
"Evalue(tql1)");
226 Real eps = FloatingPointPrecision::Epsilon();
234 Real h = eps * ( fabs(dl) + fabs(el) );
237 for (m=l; m<
n; m++)
if (fabs(E.
element(m)) <= b)
break;
241 if (m==l) {
REPORT test =
true;
break; }
243 Real g = dl;
Real p = (dl1-g) / (2.0*el);
Real r = sqrt(p*p + 1.0);
244 dl = el / (p < 0.0 ? p-r : p+r);
Real h = g - dl; f += h;
245 Real* dlx = &dl1; i =
n-l-1;
while (i--) *dlx++ -= h;
248 for (i=m-1; i>=l; i--)
252 g = c * ei; h = c * p;
253 if ( fabs(p) >= fabs(ei))
256 c = ei / p; r = sqrt(c*c + 1.0);
257 ei1 = s*p*r; s = c/r; c = 1.0/r;
262 c = p / ei; r = sqrt(c*c + 1.0);
263 ei1 = s * ei * r; s = 1.0/r; c /= r;
265 p = c * di - s*g; D.
element(i+1) = h + s * (c*g + s*di);
268 if (fabs(el) <= b) {
REPORT test =
true;
break; }
276 else {
REPORT test =
true;
break; }
Real sign(Real x, Real y)
Real Maximum(const BaseMatrix &B)
virtual void ReSize(int, int)
os2<< "> n<< " > nendobj n
void EigenValues(const SymmetricMatrix &A, DiagonalMatrix &D, Matrix &Z)
Real Minimum(const BaseMatrix &B)
void Inject(const GeneralMatrix &)
void SortSV(DiagonalMatrix &D, Matrix &U, bool ascending=false)