source: Sophya/trunk/SophyaLib/TArray/spesqmtx.h@ 4020

Last change on this file since 4020 was 3870, checked in by ansari, 15 years ago

correction commentaires pour doxygen, Reza 12/08/2010

File size: 12.4 KB
RevLine 
[3809]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
[3870]4// (C) R. Ansari, C.Magneville 2009-2010
[3809]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
15namespace SOPHYA {
16
17//--- enum definissant le type de matrice carre
18//! enum definition for the differents special square matrix types (or flavours)
19enum 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
28template <class T> class FIO_SpecialSquareMatrix;
29
30template <class T>
31class SpecialSquareMatrix : public AnyDataObj {
32public :
33
34
35// Constructor - size 0, SetSize() should be called before the object is used
36explicit SpecialSquareMatrix(SpSqMtxType typ=C_UndefinedMatrix);
37
38// Constructeur avec specification du nombre de lignes
39explicit SpecialSquareMatrix(sa_size_t rowSize, SpSqMtxType typ);
40
41// Constructor de copy (avec partage de reference de NDataBlock)
42SpecialSquareMatrix(SpecialSquareMatrix<T> const & a, bool share=true);
43
44// Allocation / changement de taille - Doit etre redefinie par les classes derivees
45virtual void SetSize(sa_size_t rowSize);
46
47//! Alias for SetSize()
48inline void ReSize(sa_size_t rowSize)
49{
50 return SetSize(rowSize);
51}
52
53//! Alias for SetSize()
54inline void ReSizeRow(sa_size_t rowSize)
55{
56 return SetSize(rowSize);
57}
58
59// Retourne l'objet sous forme d'une TMatrix<T>
60virtual TMatrix<T> ConvertToStdMatrix() const;
61
62// Clone : duplique l'objet et ses donnees
63virtual void Clone(SpecialSquareMatrix<T> const & a);
64
65// Share : recopie l'objet a avec partage des donnees des elements
66virtual void Share(SpecialSquareMatrix<T> const & a);
67
68// Operation de Share() si objet temporaire, Clone() sinon
69virtual void CloneOrShare(SpecialSquareMatrix<T> const & a);
70
71//! Flags the associated NDataBlock as temporary if \b fgtmp==true
72inline void SetTemp(bool fgtmp=false) const { mElems.SetTemp(fgtmp); }
73
74//! Return the matrix type (Diagonal, Triangular ...)
75inline SpSqMtxType MtxType() const { return mType; }
76//! Return number of rows
77inline sa_size_t NRows() const {return (int_4)mNrows;}
78//! Return number of colums ( = NRows())
79inline sa_size_t NCols() const {return (int_4)mNrows;}
80
81//! Return the total number of non zero elements
82inline sa_size_t Size() const { return mElems.Size();}
83
84//! Return reference to datablock containg matrix elements NDataBlock
85inline NDataBlock<T>& DataBlock() { return mElems; }
86//! Return reference to datablock containg matrix elements NDataBlock
87inline const NDataBlock<T>& DataBlock() const { return mElems; }
88
89//! Return a reference to the associated DVList object
90inline DVList& Info()
91 { if (mInfo==NULL) mInfo = new DVList; return (*mInfo); }
92
93// Pour mettre tous les elements a la valeur a
94virtual SpecialSquareMatrix<T>& SetCst(T a);
95
96//! Alias for SetT(a) - Set all matrix elements to the value \b a
97inline SpecialSquareMatrix<T>& SetT(T a)
98 { return SetCst(a); }
99
100// Egalite/Recopie element par element
101virtual SpecialSquareMatrix<T>& Set(SpecialSquareMatrix<T> const & a);
102
103// Remplissage avec une sequence de valeurs
104virtual SpecialSquareMatrix<T>& SetSeq(Sequence const & seq);
105
106// Ajout de la constante "b: a tous les elements
107virtual SpecialSquareMatrix<T>& AddCst(T b);
108
109// Soustrait "b" a tous les elements - fginv==true -> elem = b-elem
110virtual SpecialSquareMatrix<T>& SubCst(T b, bool fginv=false);
111
112// Multiplie "b" a tous les elements
113virtual SpecialSquareMatrix<T>& MulCst(T b);
114
115// Divise tous les elements par "b". fginv==true elem = b / elem
116virtual SpecialSquareMatrix<T>& DivCst(T b, bool fginv=false);
117
118// Addition element par element: elem(l,c) = elem(l,c) + b.elem(l,c)
119virtual SpecialSquareMatrix<T>& AddElt(SpecialSquareMatrix<T> const& b);
120
121// Soustraction element par element : elem(l,c) = elem(l,c) - b.elem(l,c)
122virtual SpecialSquareMatrix<T>& SubElt(SpecialSquareMatrix<T> const& b);
123
124// Multiplication element par element : elem(l,c) = elem(l,c) * b.elem(l,c)
125virtual SpecialSquareMatrix<T>& MulElt(SpecialSquareMatrix<T> const& b);
126
127// Division element par element : elem(l,c) = elem(l,c) / b.elem(l,c)
128virtual 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
132inline SpecialSquareMatrix<T>& operator = (T a)
133 { return SetCst(a); }
134//! operator = SpecialSquareMatrix<T> a , element by element copy operator
135inline SpecialSquareMatrix<T>& operator = (SpecialSquareMatrix<T> const & a)
136 { return Set(a); }
137//! operator = Sequence seq ,
138inline 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
143inline SpecialSquareMatrix<T>& operator += (T b)
144 { return AddCst(b); }
145//! operator -= b , subtract a constant value \b b from all elements
146inline SpecialSquareMatrix<T>& operator -= (T b)
147 { return SubCst(b); }
148//! operator *= b , multiply all elements by a constant value \b b
149inline SpecialSquareMatrix<T>& operator *= (T b)
150 { return MulCst(b); }
151//! operator /= b , divide all elements by a constant value \b b
152inline 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
156inline 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
159inline T operator[](sa_size_t index) const
160 { return mElems(index); }
161
162// Valeur min et max des elements (sauf tableaux complexes -> exception)
163virtual void MinMax(T& min, T& max) const ;
164
165// Impression / representation texte sur le flot os
166virtual ostream& Show(ostream& os) const;
167
168friend class FIO_SpecialSquareMatrix<T>;
169//..............
170protected:
171SpSqMtxType mType; //!< Type of the square matrix (diagonal, symmetric, triangular)
172sa_size_t mNrows; //!< size of the square matrix
173NDataBlock<T> mElems; //!< Data block
174DVList* mInfo; //!< Associated DVList structure
175};
176
177//! print (ascii representation) operator
178template <class T>
179inline 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 */
187template <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 */
193template <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 */
199template <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 */
205template <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 */
211template <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 */
217template <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 */
223template <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 */
229template <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) */
239template <class T>
240inline 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) */
246template <class T>
247inline 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
254template <class T>
255inline 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 */
261template <class T>
262inline 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; }
[3831]265
266//--------- extern template declarations (if needed) -----------
267#if defined ( NEED_EXT_DECL_TEMP ) && !defined( SPESQMTX_CC_BFILE )
268extern template class SpecialSquareMatrix<uint_1>;
269extern template class SpecialSquareMatrix<uint_2>;
270extern template class SpecialSquareMatrix<uint_4>;
271extern template class SpecialSquareMatrix<uint_8>;
272extern template class SpecialSquareMatrix<int_1>;
273extern template class SpecialSquareMatrix<int_2>;
274extern template class SpecialSquareMatrix<int_4>;
275extern template class SpecialSquareMatrix<int_8>;
276extern template class SpecialSquareMatrix<r_4>;
277extern template class SpecialSquareMatrix<r_8>;
278extern template class SpecialSquareMatrix< complex<r_4> >;
279extern template class SpecialSquareMatrix< complex<r_8> >;
280#ifdef SO_LDBLE128
281extern template class SpecialSquareMatrix<r_16>;
282extern template class SpecialSquareMatrix< complex<r_16> >;
283#endif
284#endif // Fin de if defined ( NEED_EXT_DECL_TEMP )
[3809]285
286} // namespace SOPHYA
287
288#endif
Note: See TracBrowser for help on using the repository browser.