19 #define REPORT { static ExeCounter ExeCount(__LINE__,8); ++ExeCount; } 35 Tracer trace(
"Crout(ludcmp)" ); sing =
false;
38 Real big = fabs(*akk);
int mu = 0;
Real* ai = akk;
int k;
40 for (k = 1; k < nrows; k++)
42 ai += nrows;
const Real trybig = fabs(*ai);
43 if (big < trybig) { big = trybig; mu = k; }
47 if (nrows)
for (k = 0;;)
67 Real* a1 = store + nrows * k;
Real* a2 = store + nrows * mu; d = !d;
69 while (j--) {
const Real temp = *a1; *a1++ = *a2; *a2++ = temp; }
72 Real diag = *akk; big = 0; mu = k + 1;
75 ai = akk;
int i = nrows - k - 1;
78 ai += nrows;
Real* al = ai;
Real mult = *al / diag; *al = mult;
79 int l = nrows - k - 1;
Real* aj = akk;
84 *(++al) -= (mult * *(++aj));
85 const Real trybig = fabs(*al);
86 if (big < trybig) { big = trybig; mu = nrows - i - 1; }
87 while (l--) *(++al) -= (mult * *(++aj));
92 if (++k == nrows)
break;
106 Tracer trace(
"Crout(lubksb)");
110 int i, j, ii = nrows;
114 for (i = 0; i < nrows; i++)
116 int ip = indx[i];
Real temp = B[ip]; B[ip] = B[i]; B[i] = temp;
117 if (temp != 0.0) { ii = i;
break; }
125 bi = B + ii; ai = store + ii + i * nrows;
128 int ip = indx[i];
Real sum = B[ip]; B[ip] = B[i];
129 Real* aij = ai;
Real* bj = bi; j = i - ii;
130 while (j--) sum -= *aij++ * *bj++;
132 if (++i == nrows)
break;
137 ai = store + nrows * nrows;
139 for (i = nrows - 1; i >= mini; i--)
141 Real* bj = B+i; ai -= nrows;
Real* ajx = ai+i;
143 j = nrows - i;
while(--j) sum -= *(++ajx) * *(++bj);
155 Real sum = 0.0;
int i = storage;
Real* s = store;
156 while (i--) sum +=
square(*s++);
163 Real sum = 0.0;
int i = storage;
Real* s = store;
164 while (i--) sum += fabs(*s++);
171 Real sum = 0.0;
int i = storage;
Real* s = store;
172 while (i--) sum += *s++;
217 if (storage == 0) NullMatrixError(
this);
218 Real maxval = 0.0;
int l = storage;
Real* s = store;
219 while (l--) {
Real a = fabs(*s++);
if (maxval < a) maxval = a; }
226 if (storage == 0) NullMatrixError(
this);
227 Real maxval = 0.0;
int l = storage;
Real* s = store;
int li = storage;
229 {
Real a = fabs(*s++);
if (maxval <= a) { maxval = a; li = l; } }
237 if (storage == 0) NullMatrixError(
this);
238 int l = storage - 1;
Real* s = store;
Real minval = fabs(*s++);
239 while (l--) {
Real a = fabs(*s++);
if (minval > a) minval = a; }
246 if (storage == 0) NullMatrixError(
this);
247 int l = storage - 1;
Real* s = store;
Real minval = fabs(*s++);
int li = l;
249 {
Real a = fabs(*s++);
if (minval >= a) { minval = a; li = l; } }
257 if (storage == 0) NullMatrixError(
this);
258 int l = storage - 1;
Real* s = store;
Real maxval = *s++;
259 while (l--) {
Real a = *s++;
if (maxval < a) maxval = a; }
266 if (storage == 0) NullMatrixError(
this);
267 int l = storage - 1;
Real* s = store;
Real maxval = *s++;
int li = l;
268 while (l--) {
Real a = *s++;
if (maxval <= a) { maxval = a; li = l; } }
276 if (storage == 0) NullMatrixError(
this);
277 int l = storage - 1;
Real* s = store;
Real minval = *s++;
278 while (l--) {
Real a = *s++;
if (minval > a) minval = a; }
285 if (storage == 0) NullMatrixError(
this);
286 int l = storage - 1;
Real* s = store;
Real minval = *s++;
int li = l;
287 while (l--) {
Real a = *s++;
if (minval >= a) { minval = a; li = l; } }
295 if (storage == 0) NullMatrixError(
this);
296 Real maxval = 0.0;
int nr = Nrows();
298 for (
int r = 1; r <= nr; r++)
301 if (c > 0) { i = r; j = c; }
310 if (storage == 0) NullMatrixError(
this);
313 for (
int r = 1; r <= nr; r++)
316 if (c > 0) { i = r; j = c; }
325 if (storage == 0) NullMatrixError(
this);
328 for (
int r = 1; r <= nr; r++)
330 int c; maxval = mr.
Maximum1(maxval, c);
331 if (c > 0) { i = r; j = c; }
340 if (storage == 0) NullMatrixError(
this);
343 for (
int r = 1; r <= nr; r++)
345 int c; minval = mr.
Minimum1(minval, c);
346 if (c > 0) { i = r; j = c; }
356 i = k / Ncols(); j = k - i * Ncols(); i++; j++;
364 i = k / Ncols(); j = k - i * Ncols(); i++; j++;
372 i = k / Ncols(); j = k - i * Ncols(); i++; j++;
380 i = k / Ncols(); j = k - i * Ncols(); i++; j++;
387 Real sum1 = 0.0;
Real sum2 = 0.0;
Real* s = store;
int nr = nrows;
388 for (
int i = 0; i<nr; i++)
391 while (j--) sum2 +=
square(*s++);
400 Real sum1 = 0.0;
Real sum2 = 0.0;
Real* s = store;
int nr = nrows;
401 for (
int i = 0; i<nr; i++)
404 while (j--) sum2 += fabs(*s++);
416 Real sum1 = 0.0;
Real sum2 = 0.0;
Real* s = store;
int nr = nrows;
417 for (
int i = 0; i<nr; i++)
420 while (j--) sum2 += *s++;
428 Real sum = *store * *store * nrows;
436 Real s = gm->SumSquare();
return s;
445 Real s = gm->SumAbsoluteValue();
return s;
451 Real s = gm->Sum();
return s;
457 Real s = gm->MaximumAbsoluteValue();
return s;
463 Real s = gm->MaximumAbsoluteValue1(i);
return s;
469 Real s = gm->MaximumAbsoluteValue2(i, j);
return s;
475 Real s = gm->MinimumAbsoluteValue();
return s;
481 Real s = gm->MinimumAbsoluteValue1(i);
return s;
487 Real s = gm->MinimumAbsoluteValue2(i, j);
return s;
493 Real s = gm->Maximum();
return s;
499 Real s = gm->Maximum1(i);
return s;
505 Real s = gm->Maximum2(i, j);
return s;
511 Real s = gm->Minimum();
return s;
517 Real s = gm->Minimum1(i);
return s;
523 Real s = gm->Minimum2(i, j);
return s;
532 while (
n--) sum += *a++ * *b++;
540 int i = nrows;
int d = i+1;
544 if (i)
for (;;) { sum += *s;
if (!(--i))
break; s += d; }
551 int i = nrows;
Real sum = 0.0;
Real* s = store;
552 while (i--) sum += *s++;
559 int i = nrows;
Real sum = 0.0;
Real* s = store;
int j = 2;
561 if (i)
for (;;) { sum += *s;
if (!(--i))
break; s += j++; }
568 int i = nrows;
Real sum = 0.0;
Real* s = store;
int j = 2;
570 if (i)
for (;;) { sum += *s;
if (!(--i))
break; s += j++; }
577 int i = nrows;
Real sum = 0.0;
Real* s = store;
578 while (i) { sum += *s; s += i--; }
585 int i = nrows;
int w = lower+upper+1;
586 Real sum = 0.0;
Real* s = store+lower;
588 if (i)
for (;;) { sum += *s;
if (!(--i))
break; s += w; }
595 int i = nrows;
int w = lower+1;
596 Real sum = 0.0;
Real* s = store+lower;
598 if (i)
for (;;) { sum += *s;
if (!(--i))
break; s += w; }
604 Real sum = *store * nrows;
619 if (
x > 0.0) { log_value += log(
x); }
620 else if (
x < 0.0) { log_value += log(-
x);
sign = -
sign; }
629 if ( (k & 1) == 0 )
sign = 1;
635 Tracer et(
"LogAndSign::Value");
636 if (log_value >= FloatingPointPrecision::LnMaximum())
638 return sign * exp(log_value);
643 if (f == 0.0) { log_value = 0.0;
sign = 0;
return; }
644 else if (f < 0.0) {
sign = -1; f = -f; }
653 while (i--) sum *= *s++;
662 if (i)
for(;;) { sum *= *s;
if (!(--i))
break; s += j++; }
670 while (i) { sum *= *s; s += i--; }
678 if (i > 0) { sum = *store; sum.
PowEq(i); }
685 LogAndSign sum = gm->LogDeterminant();
return sum;
691 Tracer tr(
"LogDeterminant");
699 if (sing)
return 0.0;
virtual Real MaximumAbsoluteValue() const
Real MaximumAbsoluteValue2(int &i, int &j) const
Real sign(Real x, Real y)
virtual Real Minimum1(int &i) const
Real Maximum(const BaseMatrix &B)
Real Minimum2(int &i, int &j) const
Real SumAbsoluteValue() const
Real MinimumAbsoluteValue1(int &i) const
virtual Real Minimum() const
Real MaximumAbsoluteValue1(int &i) const
virtual Real MaximumAbsoluteValue1(int &i) const
GeneralMatrix * Evaluate(MatrixType mt=MatrixTypeUnSp)
Real Minimum1(int &i) const
Real Maximum2(int &i, int &j) const
Real MaximumAbsoluteValue() const
Real SumAbsoluteValue() const
virtual Real MinimumAbsoluteValue() const
virtual Real MaximumAbsoluteValue2(int &i, int &j) const
LinearEquationSolver(const BaseMatrix &bm)
Real MinimumAbsoluteValue2(int &i, int &j) const
os2<< "> n<< " > nendobj n
void lubksb(Real *, int=0)
Real Maximum1(Real r, int &i)
Real DotProduct(const Matrix &A, const Matrix &B)
LogAndSign LogDeterminant() const
virtual Real Maximum1(int &i) const
virtual Real MinimumAbsoluteValue1(int &i) const
Real NormFrobenius() const
virtual LogAndSign LogDeterminant() const
virtual Real Maximum() const
Real MaximumAbsoluteValue1(Real r, int &i)
Real MaximumAbsoluteValue2(int &i, int &j) const
virtual Real Maximum2(int &i, int &j) const
virtual Real SumSquare() const
virtual GeneralMatrix * MakeSolver()
virtual GeneralMatrix * Image() const
Real MinimumAbsoluteValue2(int &i, int &j) const
virtual Real MinimumAbsoluteValue2(int &i, int &j) const
virtual Real Minimum2(int &i, int &j) const
Real Maximum1(int &i) const
Real MinimumAbsoluteValue() const
virtual Real SumAbsoluteValue() const
LogAndSign LogDeterminant() const
LogAndSign LogDeterminant() const
Real Maximum2(int &i, int &j) const
Real MinimumAbsoluteValue1(Real r, int &i)
LogAndSign LogDeterminant() const
LogAndSign LogDeterminant() const
Real Minimum2(int &i, int &j) const
virtual Real Trace() const
Real SumAbsoluteValue() const
Real SumSquare(const BaseMatrix &B)
Real Trace(const BaseMatrix &B)
Real Minimum1(Real r, int &i)
LogAndSign LogDeterminant() const