matrix/Matrix_Hermitian.hxx

00001 // Copyright (C) 2001-2009 Vivien Mallet
00002 // Copyright (C) 2003-2009 Marc Duruflé
00003 //
00004 // This file is part of the linear-algebra library Seldon,
00005 // http://seldon.sourceforge.net/.
00006 //
00007 // Seldon is free software; you can redistribute it and/or modify it under the
00008 // terms of the GNU Lesser General Public License as published by the Free
00009 // Software Foundation; either version 2.1 of the License, or (at your option)
00010 // any later version.
00011 //
00012 // Seldon is distributed in the hope that it will be useful, but WITHOUT ANY
00013 // WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
00014 // FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for
00015 // more details.
00016 //
00017 // You should have received a copy of the GNU Lesser General Public License
00018 // along with Seldon. If not, see http://www.gnu.org/licenses/.
00019 
00020 
00021 // To be included by Seldon.hxx
00022 
00023 #ifndef SELDON_FILE_MATRIX_HERMITIAN_HXX
00024 
00025 #include "../share/Common.hxx"
00026 #include "../share/Properties.hxx"
00027 #include "../share/Storage.hxx"
00028 #include "../share/Errors.hxx"
00029 #include "../share/Allocator.hxx"
00030 
00031 namespace Seldon
00032 {
00033 
00034 
00036   template <class T, class Prop, class Storage,
00037             class Allocator = SELDON_DEFAULT_ALLOCATOR<T> >
00038   class Matrix_Hermitian: public Matrix_Base<T, Allocator>
00039   {
00040     // typedef declaration.
00041   public:
00042     typedef typename Allocator::value_type value_type;
00043     typedef typename Allocator::pointer pointer;
00044     typedef typename Allocator::const_pointer const_pointer;
00045     typedef typename Allocator::reference reference;
00046     typedef typename Allocator::const_reference const_reference;
00047     typedef typename Allocator::value_type entry_type;
00048     typedef typename Allocator::value_type access_type;
00049     typedef typename Allocator::value_type const_access_type;
00050 
00051     // Attributes.
00052   protected:
00053     pointer* me_;
00054 
00055     // Methods.
00056   public:
00057     // Constructor.
00058     Matrix_Hermitian();
00059     Matrix_Hermitian(int i, int j = 0);
00060     Matrix_Hermitian(const Matrix_Hermitian<T, Prop, Storage, Allocator>& A);
00061 
00062     // Destructor.
00063     ~Matrix_Hermitian();
00064     void Clear();
00065 
00066     // Basic methods.
00067     int GetDataSize() const;
00068 
00069     // Memory management.
00070     void Reallocate(int i, int j);
00071     void SetData(int i, int j, pointer data);
00072     void Nullify();
00073     void Resize(int i, int j);
00074 
00075     // Element access and affectation.
00076     value_type operator() (int i, int j) const;
00077     const_reference Val(int i, int j) const;
00078     reference Val(int i, int j);
00079     const_reference Get(int i, int j) const;
00080     reference Get(int i, int j);
00081     reference operator[] (int i);
00082     const_reference operator[] (int i) const;
00083 
00084     Matrix_Hermitian<T, Prop, Storage, Allocator>&
00085     operator= (const Matrix_Hermitian<T, Prop, Storage, Allocator>& A);
00086 
00087     void Set(int i, int j, const T& x);
00088     void Copy(const Matrix_Hermitian<T, Prop, Storage, Allocator>& A);
00089 
00090     // Convenient functions.
00091     void Zero();
00092     void SetIdentity();
00093     void Fill();
00094     template <class T0>
00095     void Fill(const T0& x);
00096     template <class T0>
00097     Matrix_Hermitian<T, Prop, Storage, Allocator>&
00098     operator= (const T0& x);
00099     void FillRand();
00100     void Print() const;
00101     void Print(int a, int b, int m, int n) const;
00102     void Print(int l) const;
00103 
00104     // Input/output functions.
00105     void Write(string FileName) const;
00106     void Write(ostream& FileStream) const;
00107     void WriteText(string FileName) const;
00108     void WriteText(ostream& FileStream) const;
00109     void Read(string FileName);
00110     void Read(istream& FileStream);
00111     void ReadText(string FileName);
00112     void ReadText(istream& FileStream);
00113 
00114   };
00115 
00116 
00118   template <class T, class Prop, class Allocator>
00119   class Matrix<T, Prop, ColHerm, Allocator>:
00120     public Matrix_Hermitian<T, Prop, ColHerm, Allocator>
00121   {
00122     // typedef declaration.
00123   public:
00124     typedef typename Allocator::value_type value_type;
00125     typedef Prop property;
00126     typedef ColHerm storage;
00127     typedef Allocator allocator;
00128 
00129   public:
00130     Matrix();
00131     Matrix(int i, int j = 0);
00132 
00133     template <class T0>
00134     Matrix<T, Prop, ColHerm, Allocator>& operator= (const T0& x);
00135     Matrix<T, Prop, ColHerm, Allocator>& operator= (const Matrix<T, Prop,
00136                                                          ColHerm,
00137                                                          Allocator>& A);
00138     template<class T0>
00139     Matrix<T, Prop, ColHerm, Allocator>& operator*= (const T0& x);
00140 
00141   };
00142 
00143 
00145   template <class T, class Prop, class Allocator>
00146   class Matrix<T, Prop, RowHerm, Allocator>:
00147     public Matrix_Hermitian<T, Prop, RowHerm, Allocator>
00148   {
00149     // typedef declaration.
00150   public:
00151     typedef typename Allocator::value_type value_type;
00152     typedef Prop property;
00153     typedef RowHerm storage;
00154     typedef Allocator allocator;
00155 
00156   public:
00157     Matrix();
00158     Matrix(int i, int j = 0);
00159 
00160     template <class T0>
00161     Matrix<T, Prop, RowHerm, Allocator>& operator= (const T0& x);
00162     Matrix<T, Prop, RowHerm, Allocator>& operator= (const Matrix<T, Prop,
00163                                                          RowHerm,
00164                                                          Allocator>& A);
00165     template<class T0>
00166     Matrix<T, Prop, RowHerm, Allocator>& operator*= (const T0& x);
00167 
00168   };
00169 
00170 
00171 } // namespace Seldon.
00172 
00173 #define SELDON_FILE_MATRIX_HERMITIAN_HXX
00174 #endif