1 | // This may look like C code, but it is really -*- C++ -*-
|
---|
2 | // This code is part of the SOPHYA library
|
---|
3 | // (C) Univ. Paris-Sud (C) LAL-IN2P3/CNRS (C) IRFU-CEA
|
---|
4 | // (C) R. Ansari, C.Magneville 2009-2010
|
---|
5 |
|
---|
6 | #ifndef SPESQMTX_H_SEEN
|
---|
7 | #define SPESQMTX_H_SEEN
|
---|
8 |
|
---|
9 | #include "ndatablock.h"
|
---|
10 | #include "pexceptions.h"
|
---|
11 | #include "utilarr.h"
|
---|
12 | #include "tmatrix.h"
|
---|
13 |
|
---|
14 |
|
---|
15 | namespace SOPHYA {
|
---|
16 |
|
---|
17 | //--- enum definissant le type de matrice carre
|
---|
18 | //! enum definition for the differents special square matrix types (or flavours)
|
---|
19 | enum SpSqMtxType {
|
---|
20 | C_UndefinedMatrix = 0, //!< Base type
|
---|
21 | C_DiagonalMatrix = 1, //!< Diagonal Matrix
|
---|
22 | C_SymmetricMatrix = 4, //!< Symmetric Matrix
|
---|
23 | C_LowerTriangularMatrix = 8, //!< Lower Triangular Matrix
|
---|
24 | C_UpperTriangularMatrix = 9 //!< Upper Triangular Matrix
|
---|
25 | };
|
---|
26 |
|
---|
27 | //-- forward declaration for the PPF handler
|
---|
28 | template <class T> class FIO_SpecialSquareMatrix;
|
---|
29 |
|
---|
30 | template <class T>
|
---|
31 | class SpecialSquareMatrix : public AnyDataObj {
|
---|
32 | public :
|
---|
33 |
|
---|
34 |
|
---|
35 | // Constructor - size 0, SetSize() should be called before the object is used
|
---|
36 | explicit SpecialSquareMatrix(SpSqMtxType typ=C_UndefinedMatrix);
|
---|
37 |
|
---|
38 | // Constructeur avec specification du nombre de lignes
|
---|
39 | explicit SpecialSquareMatrix(sa_size_t rowSize, SpSqMtxType typ);
|
---|
40 |
|
---|
41 | // Constructor de copy (avec partage de reference de NDataBlock)
|
---|
42 | SpecialSquareMatrix(SpecialSquareMatrix<T> const & a, bool share=true);
|
---|
43 |
|
---|
44 | // Allocation / changement de taille - Doit etre redefinie par les classes derivees
|
---|
45 | virtual void SetSize(sa_size_t rowSize);
|
---|
46 |
|
---|
47 | //! Alias for SetSize()
|
---|
48 | inline void ReSize(sa_size_t rowSize)
|
---|
49 | {
|
---|
50 | return SetSize(rowSize);
|
---|
51 | }
|
---|
52 |
|
---|
53 | //! Alias for SetSize()
|
---|
54 | inline void ReSizeRow(sa_size_t rowSize)
|
---|
55 | {
|
---|
56 | return SetSize(rowSize);
|
---|
57 | }
|
---|
58 |
|
---|
59 | // Retourne l'objet sous forme d'une TMatrix<T>
|
---|
60 | virtual TMatrix<T> ConvertToStdMatrix() const;
|
---|
61 |
|
---|
62 | // Clone : duplique l'objet et ses donnees
|
---|
63 | virtual void Clone(SpecialSquareMatrix<T> const & a);
|
---|
64 |
|
---|
65 | // Share : recopie l'objet a avec partage des donnees des elements
|
---|
66 | virtual void Share(SpecialSquareMatrix<T> const & a);
|
---|
67 |
|
---|
68 | // Operation de Share() si objet temporaire, Clone() sinon
|
---|
69 | virtual void CloneOrShare(SpecialSquareMatrix<T> const & a);
|
---|
70 |
|
---|
71 | //! Flags the associated NDataBlock as temporary if \b fgtmp==true
|
---|
72 | inline void SetTemp(bool fgtmp=false) const { mElems.SetTemp(fgtmp); }
|
---|
73 |
|
---|
74 | //! Return the matrix type (Diagonal, Triangular ...)
|
---|
75 | inline SpSqMtxType MtxType() const { return mType; }
|
---|
76 | //! Return number of rows
|
---|
77 | inline sa_size_t NRows() const {return (int_4)mNrows;}
|
---|
78 | //! Return number of colums ( = NRows())
|
---|
79 | inline sa_size_t NCols() const {return (int_4)mNrows;}
|
---|
80 |
|
---|
81 | //! Return the total number of non zero elements
|
---|
82 | inline sa_size_t Size() const { return mElems.Size();}
|
---|
83 |
|
---|
84 | //! Return reference to datablock containg matrix elements NDataBlock
|
---|
85 | inline NDataBlock<T>& DataBlock() { return mElems; }
|
---|
86 | //! Return reference to datablock containg matrix elements NDataBlock
|
---|
87 | inline const NDataBlock<T>& DataBlock() const { return mElems; }
|
---|
88 |
|
---|
89 | //! Return a reference to the associated DVList object
|
---|
90 | inline DVList& Info()
|
---|
91 | { if (mInfo==NULL) mInfo = new DVList; return (*mInfo); }
|
---|
92 |
|
---|
93 | // Pour mettre tous les elements a la valeur a
|
---|
94 | virtual SpecialSquareMatrix<T>& SetCst(T a);
|
---|
95 |
|
---|
96 | //! Alias for SetT(a) - Set all matrix elements to the value \b a
|
---|
97 | inline SpecialSquareMatrix<T>& SetT(T a)
|
---|
98 | { return SetCst(a); }
|
---|
99 |
|
---|
100 | // Egalite/Recopie element par element
|
---|
101 | virtual SpecialSquareMatrix<T>& Set(SpecialSquareMatrix<T> const & a);
|
---|
102 |
|
---|
103 | // Remplissage avec une sequence de valeurs
|
---|
104 | virtual SpecialSquareMatrix<T>& SetSeq(Sequence const & seq);
|
---|
105 |
|
---|
106 | // Ajout de la constante "b: a tous les elements
|
---|
107 | virtual SpecialSquareMatrix<T>& AddCst(T b);
|
---|
108 |
|
---|
109 | // Soustrait "b" a tous les elements - fginv==true -> elem = b-elem
|
---|
110 | virtual SpecialSquareMatrix<T>& SubCst(T b, bool fginv=false);
|
---|
111 |
|
---|
112 | // Multiplie "b" a tous les elements
|
---|
113 | virtual SpecialSquareMatrix<T>& MulCst(T b);
|
---|
114 |
|
---|
115 | // Divise tous les elements par "b". fginv==true elem = b / elem
|
---|
116 | virtual SpecialSquareMatrix<T>& DivCst(T b, bool fginv=false);
|
---|
117 |
|
---|
118 | // Addition element par element: elem(l,c) = elem(l,c) + b.elem(l,c)
|
---|
119 | virtual SpecialSquareMatrix<T>& AddElt(SpecialSquareMatrix<T> const& b);
|
---|
120 |
|
---|
121 | // Soustraction element par element : elem(l,c) = elem(l,c) - b.elem(l,c)
|
---|
122 | virtual SpecialSquareMatrix<T>& SubElt(SpecialSquareMatrix<T> const& b);
|
---|
123 |
|
---|
124 | // Multiplication element par element : elem(l,c) = elem(l,c) * b.elem(l,c)
|
---|
125 | virtual SpecialSquareMatrix<T>& MulElt(SpecialSquareMatrix<T> const& b);
|
---|
126 |
|
---|
127 | // Division element par element : elem(l,c) = elem(l,c) / b.elem(l,c)
|
---|
128 | virtual SpecialSquareMatrix<T>& DivElt(SpecialSquareMatrix<T> const& b);
|
---|
129 |
|
---|
130 | //--- Operateurs = (T b) , = (SpecialSquareMatrix<T> b)
|
---|
131 | //! operator = a , to set all elements to the value \b a
|
---|
132 | inline SpecialSquareMatrix<T>& operator = (T a)
|
---|
133 | { return SetCst(a); }
|
---|
134 | //! operator = SpecialSquareMatrix<T> a , element by element copy operator
|
---|
135 | inline SpecialSquareMatrix<T>& operator = (SpecialSquareMatrix<T> const & a)
|
---|
136 | { return Set(a); }
|
---|
137 | //! operator = Sequence seq ,
|
---|
138 | inline SpecialSquareMatrix<T>& operator = (Sequence const & seq)
|
---|
139 | { return SetSeq(seq); }
|
---|
140 |
|
---|
141 | //--- Operateur += -= *= /= (T b)
|
---|
142 | //! operator += b , Add a constant value \b b to all elements
|
---|
143 | inline SpecialSquareMatrix<T>& operator += (T b)
|
---|
144 | { return AddCst(b); }
|
---|
145 | //! operator -= b , subtract a constant value \b b from all elements
|
---|
146 | inline SpecialSquareMatrix<T>& operator -= (T b)
|
---|
147 | { return SubCst(b); }
|
---|
148 | //! operator *= b , multiply all elements by a constant value \b b
|
---|
149 | inline SpecialSquareMatrix<T>& operator *= (T b)
|
---|
150 | { return MulCst(b); }
|
---|
151 | //! operator /= b , divide all elements by a constant value \b b
|
---|
152 | inline SpecialSquareMatrix<T>& operator /= (T b)
|
---|
153 | { return DivCst(b); }
|
---|
154 |
|
---|
155 | //! Element access operator (R/W): access to the element at position \b index - No bound checking
|
---|
156 | inline T& operator[](sa_size_t index)
|
---|
157 | { return mElems(index); }
|
---|
158 | //! Element access operator (RO): access to the element at position \b index - No bound checking
|
---|
159 | inline T operator[](sa_size_t index) const
|
---|
160 | { return mElems(index); }
|
---|
161 |
|
---|
162 | // Valeur min et max des elements (sauf tableaux complexes -> exception)
|
---|
163 | virtual void MinMax(T& min, T& max) const ;
|
---|
164 |
|
---|
165 | // Impression / representation texte sur le flot os
|
---|
166 | virtual ostream& Show(ostream& os) const;
|
---|
167 |
|
---|
168 | friend class FIO_SpecialSquareMatrix<T>;
|
---|
169 | //..............
|
---|
170 | protected:
|
---|
171 | SpSqMtxType mType; //!< Type of the square matrix (diagonal, symmetric, triangular)
|
---|
172 | sa_size_t mNrows; //!< size of the square matrix
|
---|
173 | NDataBlock<T> mElems; //!< Data block
|
---|
174 | DVList* mInfo; //!< Associated DVList structure
|
---|
175 | };
|
---|
176 |
|
---|
177 | //! print (ascii representation) operator
|
---|
178 | template <class T>
|
---|
179 | inline ostream& operator << (ostream& os, const SpecialSquareMatrix<T>& a)
|
---|
180 | { a.Show(os); return(os); }
|
---|
181 |
|
---|
182 | ////////////////////////////////////////////////////////////////
|
---|
183 | // Surcharge d'operateurs A (+,-,*,/) (T) x
|
---|
184 |
|
---|
185 | /*! \ingroup TArray \fn operator+(const SpecialSquareMatrix<T>&,T)
|
---|
186 | \brief Operator SpecialSquareMatrix = SpecialSquareMatrix + constant */
|
---|
187 | template <class T> inline SpecialSquareMatrix<T> operator + (const SpecialSquareMatrix<T>& a, T b)
|
---|
188 | { SpecialSquareMatrix<T> result; result.CloneOrShare(a);
|
---|
189 | result.SetTemp(true); result.AddCst(b); return result; }
|
---|
190 |
|
---|
191 | /*! \ingroup TArray \fn operator+(T,const SpecialSquareMatrix<T>&)
|
---|
192 | \brief Operator SpecialSquareMatrix = constant + SpecialSquareMatrix */
|
---|
193 | template <class T> inline SpecialSquareMatrix<T> operator + (T b,const SpecialSquareMatrix<T>& a)
|
---|
194 | { SpecialSquareMatrix<T> result; result.CloneOrShare(a);
|
---|
195 | result.SetTemp(true); result.AddCst(b); return result; }
|
---|
196 |
|
---|
197 | /*! \ingroup TArray \fn operator-(const SpecialSquareMatrix<T>&,T)
|
---|
198 | \brief Operator SpecialSquareMatrix = SpecialSquareMatrix - constant */
|
---|
199 | template <class T> inline SpecialSquareMatrix<T> operator - (const SpecialSquareMatrix<T>& a, T b)
|
---|
200 | { SpecialSquareMatrix<T> result; result.CloneOrShare(a);
|
---|
201 | result.SetTemp(true); result.SubCst(b); return result; }
|
---|
202 |
|
---|
203 | /*! \ingroup TArray \fn operator-(T,const SpecialSquareMatrix<T>&)
|
---|
204 | \brief Operator SpecialSquareMatrix = constant - SpecialSquareMatrix */
|
---|
205 | template <class T> inline SpecialSquareMatrix<T> operator - (T b,const SpecialSquareMatrix<T>& a)
|
---|
206 | { SpecialSquareMatrix<T> result; result.CloneOrShare(a);
|
---|
207 | result.SetTemp(true); result.SubCst(b, true); return result; }
|
---|
208 |
|
---|
209 | /*! \ingroup TArray \fn operator*(const SpecialSquareMatrix<T>&,T)
|
---|
210 | \brief Operator SpecialSquareMatrix = SpecialSquareMatrix * constant */
|
---|
211 | template <class T> inline SpecialSquareMatrix<T> operator * (const SpecialSquareMatrix<T>& a, T b)
|
---|
212 | { SpecialSquareMatrix<T> result; result.CloneOrShare(a);
|
---|
213 | result.SetTemp(true); result.MulCst(b); return result; }
|
---|
214 |
|
---|
215 | /*! \ingroup TArray \fn operator*(T,const SpecialSquareMatrix<T>&)
|
---|
216 | \brief Operator SpecialSquareMatrix = constant * SpecialSquareMatrix */
|
---|
217 | template <class T> inline SpecialSquareMatrix<T> operator * (T b,const SpecialSquareMatrix<T>& a)
|
---|
218 | { SpecialSquareMatrix<T> result; result.CloneOrShare(a);
|
---|
219 | result.SetTemp(true); result.MulCst(b); return result; }
|
---|
220 |
|
---|
221 | /*! \ingroup TArray \fn operator/(const SpecialSquareMatrix<T>&,T)
|
---|
222 | \brief Operator SpecialSquareMatrix = SpecialSquareMatrix / constant */
|
---|
223 | template <class T> inline SpecialSquareMatrix<T> operator / (const SpecialSquareMatrix<T>& a, T b)
|
---|
224 | { SpecialSquareMatrix<T> result; result.CloneOrShare(a);
|
---|
225 | result.SetTemp(true); result.DivCst(b); return result; }
|
---|
226 |
|
---|
227 | /*! \ingroup TArray \fn operator/(T,const SpecialSquareMatrix<T>&)
|
---|
228 | \brief Operator SpecialSquareMatrix = constant / SpecialSquareMatrix */
|
---|
229 | template <class T> inline SpecialSquareMatrix<T> operator / (T b, const SpecialSquareMatrix<T>& a)
|
---|
230 | { SpecialSquareMatrix<T> result; result.CloneOrShare(a);
|
---|
231 | result.SetTemp(true); result.DivCst(b, true); return result; }
|
---|
232 |
|
---|
233 |
|
---|
234 | ////////////////////////////////////////////////////////////////
|
---|
235 | // Surcharge d'operateurs C = A (+,-,&&,/) B
|
---|
236 |
|
---|
237 | /*! \ingroup TArray \fn operator+(const SpecialSquareMatrix<T>&,const SpecialSquareMatrix<T>&)
|
---|
238 | \brief Operator SpecialSquareMatrix = SpecialSquareMatrix + SpecialSquareMatrix (element by element addition) */
|
---|
239 | template <class T>
|
---|
240 | inline SpecialSquareMatrix<T> operator + (const SpecialSquareMatrix<T>& a,const SpecialSquareMatrix<T>& b)
|
---|
241 | { SpecialSquareMatrix<T> result; result.CloneOrShare(a);
|
---|
242 | result.SetTemp(true); result.AddElt(b); return result; }
|
---|
243 |
|
---|
244 | /*! \ingroup TArray \fn operator-(const SpecialSquareMatrix<T>&,const SpecialSquareMatrix<T>&)
|
---|
245 | \brief Operator SpecialSquareMatrix = SpecialSquareMatrix - SpecialSquareMatrix (element by element subtraction) */
|
---|
246 | template <class T>
|
---|
247 | inline SpecialSquareMatrix<T> operator - (const SpecialSquareMatrix<T>& a,const SpecialSquareMatrix<T>& b)
|
---|
248 | { SpecialSquareMatrix<T> result; result.CloneOrShare(a);
|
---|
249 | result.SetTemp(true); result.SubElt(b); return result; }
|
---|
250 |
|
---|
251 | /*! \ingroup TArray \fn operator && (const SpecialSquareMatrix<T>&,const SpecialSquareMatrix<T>&)
|
---|
252 | \brief Element by element multiplication of two arrays SpecialSquareMatrix = SpecialSquareMatrix * SpecialSquareMatrix */
|
---|
253 |
|
---|
254 | template <class T>
|
---|
255 | inline SpecialSquareMatrix<T> operator && (const SpecialSquareMatrix<T>& a,const SpecialSquareMatrix<T>& b)
|
---|
256 | { SpecialSquareMatrix<T> result; result.CloneOrShare(a);
|
---|
257 | result.SetTemp(true); result.MulElt(b); return result; }
|
---|
258 |
|
---|
259 | /*! \ingroup TArray \fn operator / (const SpecialSquareMatrix<T>&,const SpecialSquareMatrix<T>&)
|
---|
260 | \brief Element by element division of two arrays SpecialSquareMatrix = SpecialSquareMatrix / SpecialSquareMatrix */
|
---|
261 | template <class T>
|
---|
262 | inline SpecialSquareMatrix<T> operator / (const SpecialSquareMatrix<T>& a,const SpecialSquareMatrix<T>& b)
|
---|
263 | { SpecialSquareMatrix<T> result; result.CloneOrShare(a);
|
---|
264 | result.SetTemp(true); result.DivElt(b); return result; }
|
---|
265 |
|
---|
266 | //--------- extern template declarations (if needed) -----------
|
---|
267 | #if defined ( NEED_EXT_DECL_TEMP ) && !defined( SPESQMTX_CC_BFILE )
|
---|
268 | extern template class SpecialSquareMatrix<uint_1>;
|
---|
269 | extern template class SpecialSquareMatrix<uint_2>;
|
---|
270 | extern template class SpecialSquareMatrix<uint_4>;
|
---|
271 | extern template class SpecialSquareMatrix<uint_8>;
|
---|
272 | extern template class SpecialSquareMatrix<int_1>;
|
---|
273 | extern template class SpecialSquareMatrix<int_2>;
|
---|
274 | extern template class SpecialSquareMatrix<int_4>;
|
---|
275 | extern template class SpecialSquareMatrix<int_8>;
|
---|
276 | extern template class SpecialSquareMatrix<r_4>;
|
---|
277 | extern template class SpecialSquareMatrix<r_8>;
|
---|
278 | extern template class SpecialSquareMatrix< complex<r_4> >;
|
---|
279 | extern template class SpecialSquareMatrix< complex<r_8> >;
|
---|
280 | #ifdef SO_LDBLE128
|
---|
281 | extern template class SpecialSquareMatrix<r_16>;
|
---|
282 | extern template class SpecialSquareMatrix< complex<r_16> >;
|
---|
283 | #endif
|
---|
284 | #endif // Fin de if defined ( NEED_EXT_DECL_TEMP )
|
---|
285 |
|
---|
286 | } // namespace SOPHYA
|
---|
287 |
|
---|
288 | #endif
|
---|