📄 newmat8.cpp
字号:
int k; Real m = GeneralMatrix::Maximum1(k); k--;
i = k / Ncols(); j = k - i * Ncols(); i++; j++;
return m;
}
Real Matrix::Minimum2(int& i, int& j) const
{
REPORT
int k; Real m = GeneralMatrix::Minimum1(k); k--;
i = k / Ncols(); j = k - i * Ncols(); i++; j++;
return m;
}
Real SymmetricMatrix::SumSquare() const
{
REPORT
Real sum1 = 0.0; Real sum2 = 0.0; Real* s = store; int nr = nrows;
for (int i = 0; i<nr; i++)
{
int j = i;
while (j--) sum2 += square(*s++);
sum1 += square(*s++);
}
((GeneralMatrix&)*this).tDelete(); return sum1 + 2.0 * sum2;
}
Real SymmetricMatrix::SumAbsoluteValue() const
{
REPORT
Real sum1 = 0.0; Real sum2 = 0.0; Real* s = store; int nr = nrows;
for (int i = 0; i<nr; i++)
{
int j = i;
while (j--) sum2 += fabs(*s++);
sum1 += fabs(*s++);
}
((GeneralMatrix&)*this).tDelete(); return sum1 + 2.0 * sum2;
}
Real IdentityMatrix::SumAbsoluteValue() const
{ REPORT return fabs(Trace()); } // no need to do tDelete?
Real SymmetricMatrix::Sum() const
{
REPORT
Real sum1 = 0.0; Real sum2 = 0.0; Real* s = store; int nr = nrows;
for (int i = 0; i<nr; i++)
{
int j = i;
while (j--) sum2 += *s++;
sum1 += *s++;
}
((GeneralMatrix&)*this).tDelete(); return sum1 + 2.0 * sum2;
}
Real IdentityMatrix::SumSquare() const
{
Real sum = *store * *store * nrows;
((GeneralMatrix&)*this).tDelete(); return sum;
}
Real BaseMatrix::SumSquare() const
{
REPORT GeneralMatrix* gm = ((BaseMatrix&)*this).Evaluate();
Real s = gm->SumSquare(); return s;
}
Real BaseMatrix::NormFrobenius() const
{ REPORT return sqrt(SumSquare()); }
Real BaseMatrix::SumAbsoluteValue() const
{
REPORT GeneralMatrix* gm = ((BaseMatrix&)*this).Evaluate();
Real s = gm->SumAbsoluteValue(); return s;
}
Real BaseMatrix::Sum() const
{
REPORT GeneralMatrix* gm = ((BaseMatrix&)*this).Evaluate();
Real s = gm->Sum(); return s;
}
Real BaseMatrix::MaximumAbsoluteValue() const
{
REPORT GeneralMatrix* gm = ((BaseMatrix&)*this).Evaluate();
Real s = gm->MaximumAbsoluteValue(); return s;
}
Real BaseMatrix::MaximumAbsoluteValue1(int& i) const
{
REPORT GeneralMatrix* gm = ((BaseMatrix&)*this).Evaluate();
Real s = gm->MaximumAbsoluteValue1(i); return s;
}
Real BaseMatrix::MaximumAbsoluteValue2(int& i, int& j) const
{
REPORT GeneralMatrix* gm = ((BaseMatrix&)*this).Evaluate();
Real s = gm->MaximumAbsoluteValue2(i, j); return s;
}
Real BaseMatrix::MinimumAbsoluteValue() const
{
REPORT GeneralMatrix* gm = ((BaseMatrix&)*this).Evaluate();
Real s = gm->MinimumAbsoluteValue(); return s;
}
Real BaseMatrix::MinimumAbsoluteValue1(int& i) const
{
REPORT GeneralMatrix* gm = ((BaseMatrix&)*this).Evaluate();
Real s = gm->MinimumAbsoluteValue1(i); return s;
}
Real BaseMatrix::MinimumAbsoluteValue2(int& i, int& j) const
{
REPORT GeneralMatrix* gm = ((BaseMatrix&)*this).Evaluate();
Real s = gm->MinimumAbsoluteValue2(i, j); return s;
}
Real BaseMatrix::Maximum() const
{
REPORT GeneralMatrix* gm = ((BaseMatrix&)*this).Evaluate();
Real s = gm->Maximum(); return s;
}
Real BaseMatrix::Maximum1(int& i) const
{
REPORT GeneralMatrix* gm = ((BaseMatrix&)*this).Evaluate();
Real s = gm->Maximum1(i); return s;
}
Real BaseMatrix::Maximum2(int& i, int& j) const
{
REPORT GeneralMatrix* gm = ((BaseMatrix&)*this).Evaluate();
Real s = gm->Maximum2(i, j); return s;
}
Real BaseMatrix::Minimum() const
{
REPORT GeneralMatrix* gm = ((BaseMatrix&)*this).Evaluate();
Real s = gm->Minimum(); return s;
}
Real BaseMatrix::Minimum1(int& i) const
{
REPORT GeneralMatrix* gm = ((BaseMatrix&)*this).Evaluate();
Real s = gm->Minimum1(i); return s;
}
Real BaseMatrix::Minimum2(int& i, int& j) const
{
REPORT GeneralMatrix* gm = ((BaseMatrix&)*this).Evaluate();
Real s = gm->Minimum2(i, j); return s;
}
Real DotProduct(const Matrix& A, const Matrix& B)
{
REPORT
int n = A.storage;
if (n != B.storage) Throw(IncompatibleDimensionsException(A,B));
Real sum = 0.0; Real* a = A.store; Real* b = B.store;
while (n--) sum += *a++ * *b++;
return sum;
}
Real Matrix::Trace() const
{
REPORT
Tracer trace("Trace");
int i = nrows; int d = i+1;
if (i != ncols) Throw(NotSquareException(*this));
Real sum = 0.0; Real* s = store;
// while (i--) { sum += *s; s += d; }
if (i) for (;;) { sum += *s; if (!(--i)) break; s += d; }
((GeneralMatrix&)*this).tDelete(); return sum;
}
Real DiagonalMatrix::Trace() const
{
REPORT
int i = nrows; Real sum = 0.0; Real* s = store;
while (i--) sum += *s++;
((GeneralMatrix&)*this).tDelete(); return sum;
}
Real SymmetricMatrix::Trace() const
{
REPORT
int i = nrows; Real sum = 0.0; Real* s = store; int j = 2;
// while (i--) { sum += *s; s += j++; }
if (i) for (;;) { sum += *s; if (!(--i)) break; s += j++; }
((GeneralMatrix&)*this).tDelete(); return sum;
}
Real LowerTriangularMatrix::Trace() const
{
REPORT
int i = nrows; Real sum = 0.0; Real* s = store; int j = 2;
// while (i--) { sum += *s; s += j++; }
if (i) for (;;) { sum += *s; if (!(--i)) break; s += j++; }
((GeneralMatrix&)*this).tDelete(); return sum;
}
Real UpperTriangularMatrix::Trace() const
{
REPORT
int i = nrows; Real sum = 0.0; Real* s = store;
while (i) { sum += *s; s += i--; } // won t cause a problem
((GeneralMatrix&)*this).tDelete(); return sum;
}
Real BandMatrix::Trace() const
{
REPORT
int i = nrows; int w = lower+upper+1;
Real sum = 0.0; Real* s = store+lower;
// while (i--) { sum += *s; s += w; }
if (i) for (;;) { sum += *s; if (!(--i)) break; s += w; }
((GeneralMatrix&)*this).tDelete(); return sum;
}
Real SymmetricBandMatrix::Trace() const
{
REPORT
int i = nrows; int w = lower+1;
Real sum = 0.0; Real* s = store+lower;
// while (i--) { sum += *s; s += w; }
if (i) for (;;) { sum += *s; if (!(--i)) break; s += w; }
((GeneralMatrix&)*this).tDelete(); return sum;
}
Real IdentityMatrix::Trace() const
{
Real sum = *store * nrows;
((GeneralMatrix&)*this).tDelete(); return sum;
}
Real BaseMatrix::Trace() const
{
REPORT
MatrixType Diag = MatrixType::Dg; Diag.SetDataLossOK();
GeneralMatrix* gm = ((BaseMatrix&)*this).Evaluate(Diag);
Real sum = gm->Trace(); return sum;
}
void LogAndSign::operator*=(Real x)
{
if (x > 0.0) { log_value += log(x); }
else if (x < 0.0) { log_value += log(-x); sign = -sign; }
else sign = 0;
}
void LogAndSign::PowEq(int k)
{
if (sign)
{
log_value *= k;
if ( (k & 1) == 0 ) sign = 1;
}
}
Real LogAndSign::Value() const
{
Tracer et("LogAndSign::Value");
if (log_value >= FloatingPointPrecision::LnMaximum())
Throw(OverflowException("Overflow in exponential"));
return sign * exp(log_value);
}
LogAndSign::LogAndSign(Real f)
{
if (f == 0.0) { log_value = 0.0; sign = 0; return; }
else if (f < 0.0) { sign = -1; f = -f; }
else sign = 1;
log_value = log(f);
}
LogAndSign DiagonalMatrix::LogDeterminant() const
{
REPORT
int i = nrows; LogAndSign sum; Real* s = store;
while (i--) sum *= *s++;
((GeneralMatrix&)*this).tDelete(); return sum;
}
LogAndSign LowerTriangularMatrix::LogDeterminant() const
{
REPORT
int i = nrows; LogAndSign sum; Real* s = store; int j = 2;
// while (i--) { sum *= *s; s += j++; }
if (i) for(;;) { sum *= *s; if (!(--i)) break; s += j++; }
((GeneralMatrix&)*this).tDelete(); return sum;
}
LogAndSign UpperTriangularMatrix::LogDeterminant() const
{
REPORT
int i = nrows; LogAndSign sum; Real* s = store;
while (i) { sum *= *s; s += i--; }
((GeneralMatrix&)*this).tDelete(); return sum;
}
LogAndSign IdentityMatrix::LogDeterminant() const
{
REPORT
int i = nrows; LogAndSign sum;
if (i > 0) { sum = *store; sum.PowEq(i); }
((GeneralMatrix&)*this).tDelete(); return sum;
}
LogAndSign BaseMatrix::LogDeterminant() const
{
REPORT GeneralMatrix* gm = ((BaseMatrix&)*this).Evaluate();
LogAndSign sum = gm->LogDeterminant(); return sum;
}
LogAndSign GeneralMatrix::LogDeterminant() const
{
REPORT
Tracer tr("LogDeterminant");
if (nrows != ncols) Throw(NotSquareException(*this));
CroutMatrix C(*this); return C.LogDeterminant();
}
LogAndSign CroutMatrix::LogDeterminant() const
{
REPORT
if (sing) return 0.0;
int i = nrows; int dd = i+1; LogAndSign sum; Real* s = store;
if (i) for(;;)
{
sum *= *s;
if (!(--i)) break;
s += dd;
}
if (!d) sum.ChangeSign(); return sum;
}
Real BaseMatrix::Determinant() const
{
REPORT
Tracer tr("Determinant");
REPORT GeneralMatrix* gm = ((BaseMatrix&)*this).Evaluate();
LogAndSign ld = gm->LogDeterminant();
return ld.Value();
}
LinearEquationSolver::LinearEquationSolver(const BaseMatrix& bm)
: gm( ( ((BaseMatrix&)bm).Evaluate() )->MakeSolver() )
{
if (gm==&bm) { REPORT gm = gm->Image(); }
// want a copy if *gm is actually bm
else { REPORT gm->Protect(); }
}
#ifdef use_namespace
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -