source: Sophya/trunk/SophyaLib/TArray/utilarr.h@ 2795

Last change on this file since 2795 was 2286, checked in by ansari, 23 years ago

Correction lecture tableaux en ASCII - Reza 5/12/02

File size: 5.0 KB
Line 
1// This may look like C code, but it is really -*- C++ -*-
2// Utility classes for template numerical arrays
3// R. Ansari, C.Magneville 03/2000
4
5#ifndef UtilArray_SEEN
6#define UtilArray_SEEN
7
8#include "machdefs.h"
9#include "mutyv.h"
10
11#include <stdlib.h>
12#include <vector>
13
14namespace SOPHYA {
15
16/* Quelques utilitaires pour les tableaux (Array) */
17
18/*! \ingroup TArray
19 \typedef Arr_DoubleFunctionOfX
20 \brief define a function of double which returns a double
21*/
22typedef double (* Arr_DoubleFunctionOfX) (double x);
23/*! \ingroup TArray
24 \typedef Arr_FloatFunctionOfX
25 \brief define a function of float which returns a float
26*/
27typedef float (* Arr_FloatFunctionOfX) (float x);
28
29/*! \ingroup TArray
30 \typedef Arr_ComplexDoubleFunctionOfX
31 \brief define a function of a complex<double> which returns a complex<double>
32*/
33typedef complex<double> (* Arr_ComplexDoubleFunctionOfX) (complex<double> x);
34/*! \ingroup TArray
35 \typedef Arr_ComplexFloatFunctionOfX
36 \brief define a function of complex<float> which returns a complex<float>
37*/
38typedef float (* Arr_ComplexFloatFunctionOfX) (complex<float> x);
39
40//////////////////////////////////////////////////////////
41//! Class to generate a sequence of values
42class Sequence {
43public:
44 virtual ~Sequence();
45 virtual MuTyV & Value(sa_size_t k) const = 0;
46 inline MuTyV & operator () (sa_size_t k) const { return(Value(k)) ; }
47};
48
49class RandomSequence : public Sequence {
50public:
51 //! to define the generator type
52 enum {
53 Gaussian = 0, //!< gaussian generator
54 Flat = 1 //!< Flat generator
55 };
56
57 explicit RandomSequence(int typ = RandomSequence::Gaussian, double m=0., double s=1.);
58 virtual ~RandomSequence();
59 virtual MuTyV & Value(sa_size_t k) const ;
60 double Rand();
61
62protected:
63 int typ_; //!< random generation type
64 double mean_, sig_; //!< generation parameters mean and sigma (if needed)
65 mutable MuTyV retv_;
66};
67
68
69//////////////////////////////////////////////////////////
70//! Class to generate a sequence of values
71class RegularSequence : public Sequence {
72public:
73 explicit RegularSequence (double start=0., double step=1., Arr_DoubleFunctionOfX f=NULL);
74 virtual ~RegularSequence();
75
76 //! return start value of the sequence
77 inline double & Start() { return start_; }
78 //! return step value of the sequence
79 inline double & Step() { return step_; }
80
81 virtual MuTyV & Value(sa_size_t k) const ;
82
83protected:
84 double start_; //!< start value of the sequence
85 double step_; //!< step value of the sequence
86 Arr_DoubleFunctionOfX myf_; //!< pointer to the sequence function
87 mutable MuTyV retv_;
88};
89
90//////////////////////////////////////////////////////////
91//! Class for creation and handling of an explicitly defined list of values
92
93class EnumeratedSequence : public Sequence {
94public:
95 explicit EnumeratedSequence();
96 EnumeratedSequence(EnumeratedSequence const & es);
97 virtual ~EnumeratedSequence();
98 virtual MuTyV & Value(sa_size_t k) const ;
99
100 inline sa_size_t Size() const { return vecv_.size(); }
101
102 EnumeratedSequence & operator , (MuTyV const & v);
103 EnumeratedSequence & operator = (MuTyV const & v);
104
105 EnumeratedSequence & operator = (EnumeratedSequence const & es);
106
107 inline void Clear() { vecv_.clear(); }
108 void Print(ostream& os) const;
109
110 sa_size_t Append(EnumeratedSequence const & seq);
111 sa_size_t Append(string const & str, int & nbad, const char* sep=" \t");
112 sa_size_t FillFromFile(istream& is, sa_size_t& nr, sa_size_t& nc,
113 char clm='#', const char* sep=" \t");
114
115private:
116 vector<MuTyV> vecv_;
117 mutable MuTyV retv_;
118};
119
120inline ostream& operator << (ostream& os, const EnumeratedSequence& a)
121 { a.Print(os); return(os); }
122
123 //inline EnumeratedSequence operator , (MuTyV const & a, MuTyV const & b)
124 //{ EnumeratedSequence seq; return ((seq,a),b) ; }
125
126//////////////////////////////////////////////////////////
127//! Class to define a range of indexes
128class Range {
129public:
130 explicit Range(sa_size_t start=0, sa_size_t end=0, sa_size_t size=1, sa_size_t step=1);
131 //! Return the start index
132 inline sa_size_t & Start() { return start_; }
133 //! Return the last index
134 inline sa_size_t & End() { return end_; }
135 //! Return the size
136 inline sa_size_t & Size() { return size_; }
137 //! Return the step
138 inline sa_size_t & Step() { return step_; }
139protected:
140 sa_size_t start_; //!< start index
141 sa_size_t end_; //!< end index
142 sa_size_t size_; //!< size
143 sa_size_t step_; //!< step
144};
145
146//////////////////////////////////////////////////////////
147//! Class to define an identity matrix
148class IdentityMatrix {
149public:
150 explicit IdentityMatrix(double diag=1., sa_size_t n=0);
151 //! return the size of the identity matrix
152 inline sa_size_t Size() { return size_; }
153 //! return the value of the diagonal elements
154 inline double Diag() { return diag_; }
155protected:
156 sa_size_t size_; //!< size of the matrix
157 double diag_; //!< value of the diagonal elements
158};
159
160} // Fin du namespace
161
162#endif
Note: See TracBrowser for help on using the repository browser.