/* DenseMatrix.h Written by Matthew Fisher a dense matrix structure. */ template class SparseMatrix; template class DenseMatrix { public: DenseMatrix(); explicit DenseMatrix(UINT Size); explicit DenseMatrix(UINT RowCount, UINT ColCount); explicit DenseMatrix(const SparseMatrix &M); DenseMatrix(const DenseMatrix &M); ~DenseMatrix(); // // Memory // void Allocate(UINT RowCount, UINT ColCount); void Clear(T Value = 0.0); void FreeMemory(); DenseMatrix& operator = (const DenseMatrix &M); // // Files // void LoadFromFile(const String &Filename); void SaveToMATLAB(const String &Filename) const; void WriteToStream(ostream &os, char Delimeter) const; void WriteMathematicaToStream(ostream &os, const String &MatrixName) const; // // Accessors // __forceinline T* operator [] (int Row) { return &_Data[Row * _ColCount]; } __forceinline const T* operator [] (int Row) const { return &_Data[Row * _ColCount]; } __forceinline T& Cell(int Row, int Col) { return _Data[Row * _ColCount + Col]; } __forceinline const T& Cell(int Row, int Col) const { return _Data[Row * _ColCount + Col]; } __forceinline UINT RowCount() const { return _RowCount; } __forceinline UINT ColCount() const { return _ColCount; } // // Operators // void operator += (const DenseMatrix &M); // // In-place modifiers // void Identity(); void Identity(UINT Size); void InvertInPlace(); // // Query // bool Square() const; bool ElementsValid(); T Determinant(); void ExtractRow(UINT Row, Vector &Result); void ExtractCol(UINT Col, Vector &Result); Vector ExtractRow(UINT Row); Vector ExtractCol(UINT Col); // // Linear algebra // DenseMatrix Inverse(); DenseMatrix Transpose(); void LUDecomposition(DenseMatrix &L, DenseMatrix &U); void LUSolve(Vector &x, const Vector &b); bool EigenSystem(Vector &Eigenvalues, DenseMatrix &Eigenvectors) const; bool EigenSystem(T *Eigenvalues, T **Eigenvectors) const; String EigenTest(const Vector &Eigenvalues, const DenseMatrix &Eigenvectors) const; String EigenTest(const T *Eigenvalues, const T **Eigenvectors) const; bool VictorEigenSystem(Vector &Eigenvalues, DenseMatrix &Eigenvectors) const; // // Conversion // /*void ToColumnVector(Vector &Result) { Assert(_ColCount == 1, "ToColumnVector called with more than 1 column"); Result.ReSize(_RowCount); for(UINT RowIndex = 0; RowIndex < _RowCount; RowIndex++) { Result[RowIndex] = Cell(RowIndex, 0); } }*/ // // Static helper functions for functional-style sparse matrix manipulation. Since the copy constructor // for a dense matrix can be costly, this approach may be more efficient that using operator overloading. // static void Multiply(DenseMatrix &Result, const DenseMatrix &Left, const DenseMatrix &Right); static void Multiply(DenseMatrix &Result, const SparseMatrix &Left, const DenseMatrix &Right); static void Multiply(DenseMatrix &Result, const DenseMatrix &Left, const SparseMatrix &Right); static void MultiplyMMTranspose(DenseMatrix &Result, const DenseMatrix &M); static void MultiplyMMTranspose(DenseMatrix &Result, const SparseMatrix &M); static void Multiply(Vector &Result, const DenseMatrix &Left, const Vector &Right); static void MultiplyInPlace(DenseMatrix &Result, T Right); static DenseMatrix OuterProduct(const Vector &A, const Vector &B); static T CompareMatrices(const DenseMatrix &Left, const DenseMatrix &Right); private: UINT _RowCount, _ColCount; //Vector _Data; T *_Data; }; // // Overloaded operators // template ostream& operator << (ostream &os, const DenseMatrix &m); template DenseMatrix operator * (const DenseMatrix &Left, const DenseMatrix &Right); template DenseMatrix operator * (const DenseMatrix &Left, const SparseMatrix &Right); template DenseMatrix operator * (const SparseMatrix &Left, const DenseMatrix &Right); template DenseMatrix operator * (const DenseMatrix &Left, T Right); template DenseMatrix operator * (T Left, const DenseMatrix &Right); template DenseMatrix operator + (const DenseMatrix &Left, const DenseMatrix &Right); template DenseMatrix operator - (const DenseMatrix &Left, const DenseMatrix &Right); #include "DenseMatrix.cpp"