source: Sophya/trunk/SophyaLib/NTools/cvector.cc@ 243

Last change on this file since 243 was 220, checked in by ansari, 26 years ago

Creation module DPC/NTools Reza 09/04/99

File size: 3.5 KB
Line 
1#include "defs.h"
2#include <string.h>
3#include "cvector.h"
4#include "generalfit.h"
5
6//++
7// Class Vector
8// Lib Outils++
9// include cvector.h
10//
11// Vecteur colonne, en fait une matrice avec une seule colonne, pour faire
12// des opérations matricielles.
13//--
14
15//++
16// Links Parents
17// Matrix
18//--
19
20//++
21// Titre Constructeurs
22//--
23
24//++
25Vector::Vector(int n)
26//
27// Constructeur, n = nombre d'éléments.
28//--
29: Matrix(n, 1)
30{END_CONSTRUCTOR}
31
32
33//++
34Vector::Vector(int n, double* values)
35//
36// Constructeur, à partir des valeurs. Pas d'allocation.
37//--
38: Matrix(n, 1, values)
39{END_CONSTRUCTOR}
40
41
42//++
43Vector::Vector(const Vector& v)
44//
45// Constructeur par copie.
46//--
47: Matrix(v)
48{END_CONSTRUCTOR}
49
50
51//++
52Vector::Vector(const Matrix& a)
53//
54// Constructeur par "copie" à partir d'une matrice, qui doit avoir une seule colonne.
55//
56// *Exceptions :*
57// sizeMismatchErr si la matrice a plus d'une colonne
58//--
59: Matrix(a.nr,1) // Matrix(a) ne marche pas, pourquoi ???? bug gcc ???
60{
61 if (a.nc != 1) THROW(sizeMismatchErr);
62 memcpy(data, a.data, a.nr * sizeof(double));
63 END_CONSTRUCTOR
64}
65
66//++
67// Titre Opérateurs
68//--
69
70//++
71// double& operator()(int n)
72// double const& operator()(int n) const
73// Accès aux éléments.
74//--
75
76
77//++
78Vector& Vector::operator = (double x)
79//
80// Affectation à partir d'un scalaire. Tous les éléments prennent cette valeur.
81//--
82{
83 for (int i=0; i<nr; i++)
84 (*this)(i) = x ;
85 return *this;
86}
87
88//++
89double operator* (const Vector& v1, const Vector& v2)
90//
91// Produit scalaire entre deux vecteurs.
92//--
93{
94 if (v1.nr != v2.nr) THROW(sizeMismatchErr);
95 double *p = v1.data;
96 double *pEnd = v1.data + v1.ndata;
97 double *q = v2.data;
98
99 double r = 0;
100
101 while (p<pEnd)
102 r += *p++ * *q++;
103
104 return r;
105}
106
107//++
108// Vector operator* (const Vector& v, double b)
109// multiplication par un scalaire.
110//--
111
112//++
113// Vector operator* (const Matrix& a, const Vector& b)
114// produit matrice*vecteur.
115//--
116
117//++
118// Titres Méthodes
119//--
120
121//++
122// int NElts() const
123//
124// Nombre de lignes du vecteur.
125//--
126
127//++
128// void Realloc(int n, bool force=false)
129//
130// Change la taille du vecteur. Réallocation physique seulement si
131// pas assez de place, ou forcée si force=true.
132//--
133
134//++
135double LinSolveInPlace(Matrix& a, Vector& b)
136//
137// Résolution du système A*C = B
138//--
139{
140 if (a.NCol() != b.NRows()) THROW(sizeMismatchErr);
141 if (a.NCol() != a.NRows()) THROW(sizeMismatchErr);
142
143 return Matrix::GausPiv(a,b);
144}
145
146
147//++
148double LinSolve(const Matrix& a, const Vector& b, Vector& c)
149//
150// Résolution du système A*C = B, avec C retourné dans B
151//--
152{
153 if (a.NCol() != b.NRows()) THROW(sizeMismatchErr);
154 if (a.NCol() != a.NRows()) THROW(sizeMismatchErr);
155 c = b;
156 Matrix a1(a);
157 return Matrix::GausPiv(a1,c);
158}
159
160//////////////////////////////////////////////////////////
161//++
162Vector* Vector::FitResidus(GeneralFit& gfit)
163//
164// Retourne une classe contenant les residus du fit ``gfit''.
165// On suppose que x=i.
166//--
167{
168if(NElts()<=0) return NULL;
169GeneralFunction* f = gfit.GetFunction();
170if(f==NULL) return NULL;
171Vector par = gfit.GetParm();
172Vector* v = new Vector(*this);
173for(int i=0;i<NElts();i++) {
174 double x = (double)i;
175 (*v)(i) -= f->Value(&x,par.Data());
176}
177return v;
178}
179
180//++
181Vector* Vector::FitFunction(GeneralFit& gfit)
182//
183// Retourne une classe contenant la fonction du fit ``gfit''.
184// On suppose que x=i.
185//--
186{
187if(NElts()<=0) return NULL;
188GeneralFunction* f = gfit.GetFunction();
189if(f==NULL) return NULL;
190Vector par = gfit.GetParm();
191Vector* v = new Vector(*this);
192for(int i=0;i<NElts();i++) {
193 double x = (double)i;
194 (*v)(i) = f->Value(&x,par.Data());
195}
196return v;
197}
Note: See TracBrowser for help on using the repository browser.