You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

172 lines
4.7 KiB
C++

//$$ newmatap.h definition file for matrix package applications
// Copyright (C) 1991,2,3,4,8: R B Davies
#ifndef NEWMATAP_LIB
#define NEWMATAP_LIB 0
#include "newmat.h"
#ifdef use_namespace
namespace NEWMAT {
#endif
// ************************** applications *****************************/
void QRZT(Matrix&, LowerTriangularMatrix&);
void QRZT(const Matrix&, Matrix&, Matrix&);
void QRZ(Matrix&, UpperTriangularMatrix&);
void QRZ(const Matrix&, Matrix&, Matrix&);
inline void HHDecompose(Matrix& X, LowerTriangularMatrix& L)
{ QRZT(X,L); }
inline void HHDecompose(const Matrix& X, Matrix& Y, Matrix& M)
{ QRZT(X, Y, M); }
ReturnMatrix Cholesky(const SymmetricMatrix&);
ReturnMatrix Cholesky(const SymmetricBandMatrix&);
void SVD(const Matrix&, DiagonalMatrix&, Matrix&, Matrix&,
bool=true, bool=true);
void SVD(const Matrix&, DiagonalMatrix&);
inline void SVD(const Matrix& A, DiagonalMatrix& D, Matrix& U,
bool withU = true) { SVD(A, D, U, U, withU, false); }
void SortSV(DiagonalMatrix& D, Matrix& U, bool ascending = false);
void SortSV(DiagonalMatrix& D, Matrix& U, Matrix& V, bool ascending = false);
void Jacobi(const SymmetricMatrix&, DiagonalMatrix&);
void Jacobi(const SymmetricMatrix&, DiagonalMatrix&, SymmetricMatrix&);
void Jacobi(const SymmetricMatrix&, DiagonalMatrix&, Matrix&);
void Jacobi(const SymmetricMatrix&, DiagonalMatrix&, SymmetricMatrix&,
Matrix&, bool=true);
void EigenValues(const SymmetricMatrix&, DiagonalMatrix&);
void EigenValues(const SymmetricMatrix&, DiagonalMatrix&, SymmetricMatrix&);
void EigenValues(const SymmetricMatrix&, DiagonalMatrix&, Matrix&);
class SymmetricEigenAnalysis
// not implemented yet
{
public:
SymmetricEigenAnalysis(const SymmetricMatrix&);
private:
DiagonalMatrix diag;
DiagonalMatrix offdiag;
SymmetricMatrix backtransform;
FREE_CHECK(SymmetricEigenAnalysis)
};
void SortAscending(GeneralMatrix&);
void SortDescending(GeneralMatrix&);
// class for deciding which fft to use and containing new fft function
class FFT_Controller
{
public:
static bool OnlyOldFFT;
static bool ar_1d_ft (int PTS, Real* X, Real *Y);
static bool CanFactor(int PTS);
};
void FFT(const ColumnVector&, const ColumnVector&,
ColumnVector&, ColumnVector&);
void FFTI(const ColumnVector&, const ColumnVector&,
ColumnVector&, ColumnVector&);
void RealFFT(const ColumnVector&, ColumnVector&, ColumnVector&);
void RealFFTI(const ColumnVector&, const ColumnVector&, ColumnVector&);
void DCT_II(const ColumnVector&, ColumnVector&);
void DCT_II_inverse(const ColumnVector&, ColumnVector&);
void DST_II(const ColumnVector&, ColumnVector&);
void DST_II_inverse(const ColumnVector&, ColumnVector&);
void DCT(const ColumnVector&, ColumnVector&);
void DCT_inverse(const ColumnVector&, ColumnVector&);
void DST(const ColumnVector&, ColumnVector&);
void DST_inverse(const ColumnVector&, ColumnVector&);
// This class is used by the new FFT program
// Suppose an integer is expressed as a sequence of digits with each
// digit having a different radix.
// This class supposes we are counting with this multi-radix number
// but also keeps track of the number with the digits (and radices)
// reversed.
// The integer starts at zero
// operator++() increases it by 1
// Counter gives the number of increments
// Reverse() gives the value with the digits in reverse order
// Swap is true if reverse is less than counter
// Finish is true when we have done a complete cycle and are back at zero
class MultiRadixCounter
{
const SimpleIntArray& Radix;
// radix of each digit
// n-1 highest order, 0 lowest order
SimpleIntArray& Value; // value of each digit
const int n; // number of digits
int reverse; // value when order of digits is reversed
int product; // product of radices
int counter; // counter
bool finish; // true when we have gone over whole range
public:
MultiRadixCounter(int nx, const SimpleIntArray& rx,
SimpleIntArray& vx);
void operator++(); // increment the multi-radix counter
bool Swap() const { return reverse < counter; }
bool Finish() const { return finish; }
int Reverse() const { return reverse; }
int Counter() const { return counter; }
};
#ifdef use_namespace
}
#endif
#endif
// body file: cholesky.cpp
// body file: evalue.cpp
// body file: fft.cpp
// body file: hholder.cpp
// body file: jacobi.cpp
// body file: newfft.cpp
// body file: sort.cpp
// body file: svd.cpp