15 #include "../config/config.hpp"
54 { data = d; capacity = -h*w; }
61 { data = d;
height = h;
width = w; capacity = -h*w; }
67 void Reset(
double *d,
int h,
int w)
88 inline double *
Data()
const {
return data; }
90 inline double *
GetData()
const {
return data; }
92 inline bool OwnsData()
const {
return (capacity > 0); }
98 inline const double &
operator()(
int i,
int j)
const;
104 double Trace()
const;
107 virtual double &
Elem(
int i,
int j);
110 virtual const double &
Elem(
int i,
int j)
const;
113 void Mult(
const double *x,
double *y)
const;
134 double InnerProduct(
const double *x,
const double *y)
const;
151 {
return InnerProduct((
const double *)x, (
const double *)y); }
186 void Norm2(
double *v)
const;
192 double FNorm()
const;
198 { Eigensystem(ev, &evect); }
201 { Eigensystem(ev, &evect); }
204 int Rank(
double tol)
const;
224 void SetRow(
int row,
double value);
226 void SetCol(
int col,
double value);
236 void Diag(
double c,
int n);
238 void Diag(
double *diag,
int n);
273 int row_offset,
int col_offset);
275 void CopyMNDiag(
double c,
int n,
int row_offset,
int col_offset);
277 void CopyMNDiag(
double *diag,
int n,
int row_offset,
int col_offset);
300 virtual void Print(std::ostream &out = std::cout,
int width_ = 4)
const;
301 virtual void PrintMatlab(std::ostream &out = std::cout)
const;
303 virtual void PrintT(std::ostream &out = std::cout,
int width_ = 4)
const;
313 void Add(
const DenseMatrix &A,
const DenseMatrix &B,
314 double alpha, DenseMatrix &C);
317 void Add(
double alpha,
const DenseMatrix &A,
318 double beta,
const DenseMatrix &B, DenseMatrix &C);
321 void Mult(
const DenseMatrix &b,
const DenseMatrix &c, DenseMatrix &a);
324 void AddMult(
const DenseMatrix &b,
const DenseMatrix &c, DenseMatrix &a);
329 void CalcAdjugate(
const DenseMatrix &a, DenseMatrix &adja);
336 void CalcInverse(
const DenseMatrix &a, DenseMatrix &inva);
344 void CalcOrtho(
const DenseMatrix &J, Vector &n);
347 void MultAAt(
const DenseMatrix &a, DenseMatrix &aat);
350 void MultADAt(
const DenseMatrix &A,
const Vector &D, DenseMatrix &ADAt);
353 void AddMultADAt(
const DenseMatrix &A,
const Vector &D, DenseMatrix &ADAt);
356 void MultABt(
const DenseMatrix &A,
const DenseMatrix &B, DenseMatrix &ABt);
359 void MultADBt(
const DenseMatrix &A,
const Vector &D,
360 const DenseMatrix &B, DenseMatrix &ADBt);
363 void AddMultABt(
const DenseMatrix &A,
const DenseMatrix &B, DenseMatrix &ABt);
366 void AddMultADBt(
const DenseMatrix &A,
const Vector &D,
367 const DenseMatrix &B, DenseMatrix &ADBt);
370 void AddMult_a_ABt(
double a,
const DenseMatrix &A,
const DenseMatrix &B,
374 void MultAtB(
const DenseMatrix &A,
const DenseMatrix &B, DenseMatrix &AtB);
377 void AddMult_a_AAt(
double a,
const DenseMatrix &A, DenseMatrix &AAt);
380 void Mult_a_AAt(
double a,
const DenseMatrix &A, DenseMatrix &AAt);
383 void MultVVt(
const Vector &v, DenseMatrix &vvt);
385 void MultVWt(
const Vector &v,
const Vector &w, DenseMatrix &VWt);
388 void AddMultVWt(
const Vector &v,
const Vector &w, DenseMatrix &VWt);
391 void AddMult_a_VWt(
const double a,
const Vector &v,
const Vector &w,
395 void AddMult_a_VVt(
const double a,
const Vector &v, DenseMatrix &VVt);
405 #ifdef MFEM_USE_LAPACK
424 void Mult(
int m,
int n,
double *X)
const;
428 void LSolve(
int m,
int n,
double *X)
const;
432 void USolve(
int m,
int n,
double *X)
const;
436 void Solve(
int m,
int n,
double *X)
const;
443 static void SubMult(
int m,
int n,
int r,
const double *A21,
444 const double *X1,
double *X2);
456 void BlockFactor(
int m,
int n,
double *A12,
double *A21,
double *A22)
const;
474 double *B1,
double *B2)
const;
483 const double *X2,
double *Y1)
const;
546 #ifdef MFEM_USE_LAPACK
573 #ifdef MFEM_USE_LAPACK
613 tdata =
new double[i*j*k];
623 if (own_data) {
delete [] tdata; }
626 tdata =
new double[i*j*k];
632 if (own_data) {
delete [] tdata; }
650 double *
Data() {
return tdata; }
661 if (own_data) {
delete [] tdata; }
670 MFEM_ASSERT(data && i >= 0 && i < height && j >= 0 && j <
width,
"");
676 MFEM_ASSERT(data && i >= 0 && i < height && j >= 0 && j <
width,
"");
virtual void PrintT(std::ostream &out=std::cout, int width_=4) const
Prints the transpose matrix to stream out.
int Size() const
For backward compatibility define Size to be synonym of Width()
void Symmetrize()
(*this) = 1/2 ((*this) + (*this)^t)
void MultABt(const DenseMatrix &A, const DenseMatrix &B, DenseMatrix &ABt)
Multiply a matrix A with the transpose of a matrix B: A*Bt.
void SymmetricScaling(const Vector &s)
SymmetricScaling this = diag(sqrt(s)) * this * diag(sqrt(s))
int CheckFinite(const double *v, const int n)
void AddMultVWt(const Vector &v, const Vector &w, DenseMatrix &VWt)
VWt += v w^t.
DenseMatrix & operator*=(double c)
void GetDiag(Vector &d) const
Returns the diagonal of the matrix.
void UseExternalData(double *ext_data, int i, int j, int k)
void MultVWt(const Vector &v, const Vector &w, DenseMatrix &VWt)
DenseMatrix & operator+=(DenseMatrix &m)
void InvRightScaling(const Vector &s)
InvRightScaling: this = this * diag(1./s);.
const DenseMatrix & operator()(int k) const
void Eigenvalues(Vector &ev)
void SingularValues(Vector &sv) const
DenseMatrix & operator()(int k)
double Det() const
Calculates the determinant of the matrix (for 2x2 or 3x3 matrices)
void Mult(const Table &A, const Table &B, Table &C)
C = A * B (as boolean matrices)
int Width() const
Get the width (size of input) of the Operator. Synonym with NumCols().
void BlockFactor(int m, int n, double *A12, double *A21, double *A22) const
void BlockBackSolve(int m, int n, int r, const double *U12, const double *X2, double *Y1) const
double InnerProduct(const double *x, const double *y) const
Compute y^t A x.
void CalcAdjugate(const DenseMatrix &a, DenseMatrix &adja)
void AddMult(const Table &elem_dof, const Vector &x, Vector &y) const
void TestInversion()
Invert and print the numerical conditioning of the inversion.
Data type dense matrix using column-major storage.
void CopyRows(const DenseMatrix &A, int row1, int row2)
Copy rows row1 through row2 from A to *this.
void SetSize(int i, int j, int k)
void Eval(DenseMatrix &M)
Abstract data type for matrix inverse.
void AddMult_a_ABt(double a, const DenseMatrix &A, const DenseMatrix &B, DenseMatrix &ABt)
ABt += a * A * B^t.
void GetInverseMatrix(DenseMatrix &Ainv) const
Compute and return the inverse matrix in Ainv.
void Factor()
Factor the current DenseMatrix, *a.
void GetInverseMatrix(int m, double *X) const
Assuming L.U = P.A factored data of size (m x m), compute X <- A^{-1}.
double * GetData() const
Returns the matrix data array.
void CalcOrtho(const DenseMatrix &J, Vector &n)
DenseMatrix & operator=(double c)
Sets the matrix elements equal to constant c.
void Mult_a_AAt(double a, const DenseMatrix &A, DenseMatrix &AAt)
AAt = a * A * A^t.
static void SubMult(int m, int n, int r, const double *A21, const double *X1, double *X2)
const Vector & Eigenvector(int i)
virtual void Mult(const Vector &x, Vector &y) const
Matrix vector multiplication with the inverse of dense matrix.
const double & operator()(int i, int j, int k) const
void Add(const DenseMatrix &A, const DenseMatrix &B, double alpha, DenseMatrix &C)
C = A + alpha*B.
double & operator()(int i, int j)
Returns reference to a_{ij}.
void USolve(int m, int n, double *X) const
double FNorm() const
Compute the Frobenius norm of the matrix.
void MultTranspose(const double *x, double *y) const
Multiply a vector with the transpose matrix.
void CalcAdjugateTranspose(const DenseMatrix &a, DenseMatrix &adjat)
Calculate the transposed adjugate of a matrix (for NxN matrices, N=1,2,3)
double & operator()(int i, int j, int k)
void AddMult(const DenseMatrix &b, const DenseMatrix &c, DenseMatrix &a)
Matrix matrix multiplication. A += B * C.
double operator*(const DenseMatrix &m) const
Matrix inner product: tr(A^t B)
double Singularvalue(int i)
void Reset(double *d, int h, int w)
Change the data array and the size of the DenseMatrix.
int Height() const
Get the height (size of output) of the Operator. Synonym with NumRows().
void Add(const double c, const DenseMatrix &A)
Adds the matrix A multiplied by the number c to the matrix.
void AddMult_a_VWt(const double a, const Vector &v, const Vector &w, DenseMatrix &VWt)
VWt += a * v w^t.
void InvSymmetricScaling(const Vector &s)
InvSymmetricScaling this = diag(sqrt(1./s)) * this * diag(sqrt(1./s))
void BlockForwSolve(int m, int n, int r, const double *L21, double *B1, double *B2) const
DenseMatrixSVD(DenseMatrix &M)
Abstract data type matrix.
void Norm2(double *v) const
Take the 2-norm of the columns of A and store in v.
void MultADBt(const DenseMatrix &A, const Vector &D, const DenseMatrix &B, DenseMatrix &ADBt)
ADBt = A D B^t, where D is diagonal.
void Invert()
Replaces the current matrix with its inverse.
virtual ~DenseMatrixInverse()
Destroys dense inverse matrix.
void LSolve(int m, int n, double *X) const
void LeftScaling(const Vector &s)
LeftScaling this = diag(s) * this.
void CopyMNDiag(double c, int n, int row_offset, int col_offset)
Copy c on the diagonal of size n to *this at row_offset, col_offset.
virtual void PrintMatlab(std::ostream &out=std::cout) const
~DenseMatrixEigensystem()
void AddMult_a_VVt(const double a, const Vector &v, DenseMatrix &VVt)
VVt += a * v v^t.
void Neg()
(*this) = -(*this)
virtual void Print(std::ostream &out=std::cout, int width_=4) const
Prints matrix to stream out.
virtual void SetOperator(const Operator &op)
Set/update the solver for the given operator.
void Solve(int m, int n, double *X) const
void SetRow(int r, const Vector &row)
void Getl1Diag(Vector &l) const
Returns the l1 norm of the rows of the matrix v_i = sum_j |a_ij|.
void AddToVector(int offset, Vector &v) const
Add the matrix 'data' to the Vector 'v' at the given 'offset'.
DenseMatrix & Eigenvectors()
void GetColumn(int c, Vector &col) const
void AddMult(const Vector &x, Vector &y) const
y += A.x
void Threshold(double eps)
Replace small entries, abs(a_ij) <= eps, with zero.
void CalcInverse(const DenseMatrix &a, DenseMatrix &inva)
void TestInversion()
Print the numerical conditioning of the inversion: ||A^{-1} A - I||.
double MaxMaxNorm() const
Compute the norm ||A|| = max_{ij} |A_{ij}|.
double * Data() const
Returns the matrix data array.
void Transpose()
(*this) = (*this)^t
void MultVVt(const Vector &v, DenseMatrix &vvt)
Make a matrix from a vector V.Vt.
double Trace() const
Trace of a square matrix.
void AddMultABt(const DenseMatrix &A, const DenseMatrix &B, DenseMatrix &ABt)
ABt += A * B^t.
DenseTensor(int i, int j, int k)
void MultAAt(const DenseMatrix &a, DenseMatrix &aat)
Calculate the matrix A.At.
void GetColumnReference(int c, Vector &col)
void AddMatrix(DenseMatrix &A, int ro, int co)
Perform (ro+i,co+j)+=A(i,j) for 0<=i<A.Height, 0<=j<A.Width.
DenseMatrix(double *d, int h, int w)
void Clear()
Delete the matrix data array (if owned) and reset the matrix state.
void CalcInverseTranspose(const DenseMatrix &a, DenseMatrix &inva)
Calculate the inverse transpose of a matrix (for NxN matrices, N=1,2,3)
void SetDataAndSize(double *d, int s)
Set the Vector data and size.
DenseMatrix & operator-=(DenseMatrix &m)
void MultADAt(const DenseMatrix &A, const Vector &D, DenseMatrix &ADAt)
ADAt = A D A^t, where D is diagonal.
int height
Dimension of the output / number of rows in the matrix.
void CopyCols(const DenseMatrix &A, int col1, int col2)
Copy columns col1 through col2 from A to *this.
virtual MatrixInverse * Inverse() const
Returns a pointer to the inverse matrix.
double * GetColumn(int col)
void AddMultADBt(const DenseMatrix &A, const Vector &D, const DenseMatrix &B, DenseMatrix &ADBt)
ADBt = A D B^t, where D is diagonal.
virtual ~DenseMatrix()
Destroys dense matrix.
void CopyMNt(const DenseMatrix &A, int row_offset, int col_offset)
Copy matrix A^t to the location in *this at row_offset, col_offset.
void Diag(double c, int n)
Creates n x n diagonal matrix with diagonal elements c.
void Mult(int m, int n, double *X) const
static const int ipiv_base
void GradToCurl(DenseMatrix &curl)
DenseMatrixInverse()
Default constructor.
double CalcSingularvalue(const int i) const
Return the i-th singular value (decreasing order) of NxN matrix, N=1,2,3.
void GetRowSums(Vector &l) const
Compute the row sums of the DenseMatrix.
void GetRow(int r, Vector &row)
void CalcEigenvalues(double *lambda, double *vec) const
void Eigenvalues(Vector &ev, DenseMatrix &evect)
DenseMatrixEigensystem(DenseMatrix &m)
int Rank(double tol) const
LUFactors(double *data_, int *ipiv_)
void AddMult_a(double a, const Vector &x, Vector &y) const
y += a * A.x
void RightScaling(const Vector &s)
RightScaling: this = this * diag(s);.
void MultAtB(const DenseMatrix &A, const DenseMatrix &B, DenseMatrix &AtB)
Multiply the transpose of a matrix A with a matrix B: At*B.
void Mult(const double *x, double *y) const
Matrix vector multiplication.
void AddMultTranspose_a(double a, const Vector &x, Vector &y) const
void AddMultADAt(const DenseMatrix &A, const Vector &D, DenseMatrix &ADAt)
ADAt += A D A^t, where D is diagonal.
void GetFromVector(int offset, const Vector &v)
Get the matrix 'data' from the Vector 'v' at the given 'offset'.
void CopyMN(const DenseMatrix &A, int m, int n, int Aro, int Aco)
Copy the m x n submatrix of A at row/col offsets Aro/Aco to *this.
void InvLeftScaling(const Vector &s)
InvLeftScaling this = diag(1./s) * this.
void UseExternalData(double *d, int h, int w)
Change the data array and the size of the DenseMatrix.
void SetCol(int c, const Vector &col)
void Eigensystem(Vector &ev, DenseMatrix &evect)
void SetSize(int s)
Change the size of the DenseMatrix to s x s.
int Size() const
Get the size of the inverse matrix.
Vector & Singularvalues()
Rank 3 tensor (array of matrices)
double InnerProduct(const Vector &x, const Vector &y) const
Compute y^t A x.
virtual double & Elem(int i, int j)
Returns reference to a_{ij}.
void AdjustDofDirection(Array< int > &dofs)
void GradToDiv(Vector &div)
void AddMult_a_AAt(double a, const DenseMatrix &A, DenseMatrix &AAt)
AAt += a * A * A^t.
int width
Dimension of the input / number of columns in the matrix.