00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083 #ifndef _VEC_H
00084 #define _VEC_H
00085
00086 #include <assert.h>
00087
00088 #include "mat.h"
00089 #include "sysmat.h"
00090 #include "matvec.h"
00091
00092
00093
00094
00095 class cVector;
00096
00097
00098
00099
00100 struct sSclVec
00101 {
00102 const double &scl;
00103 const cVector &vec;
00104 sSclVec(const double &a, const cVector &u) : scl(a), vec(u) { }
00105 };
00106
00107 inline sSclVec operator*(const double &a, const cVector &v)
00108 {
00109 return(sSclVec(a, v));
00110 }
00111
00112 struct sAddVec
00113 {
00114 const cVector &lvec;
00115 const cVector &rvec;
00116 sAddVec(const cVector &u, const cVector &v) : lvec(u), rvec(v) { }
00117 };
00118
00119 inline sAddVec operator+(const cVector &u, const cVector &v)
00120 {
00121 return(sAddVec(u, v));
00122 }
00123
00124 struct sSubVec
00125 {
00126 const cVector &lvec;
00127 const cVector &rvec;
00128 sSubVec(const cVector &u, const cVector &v) : lvec(u), rvec(v) { }
00129 };
00130
00131 inline sSubVec operator-(const cVector &u, const cVector &v)
00132 {
00133 return(sSubVec(u, v));
00134 }
00135
00136 struct sDivVec
00137 {
00138 const cVector &lvec;
00139 const cVector &rvec;
00140 sDivVec(const cVector &u, const cVector &v) : lvec(u), rvec(v) { }
00141 };
00142
00143 inline sDivVec operator/(const cVector &u, const cVector &v)
00144 {
00145 return(sDivVec(u, v));
00146 }
00147
00148 struct sSclAddVec
00149 {
00150 const sSclVec ∏
00151 const cVector &rvec;
00152 sSclAddVec(const sSclVec &au, const cVector &v) : prod(au), rvec(v) { }
00153 };
00154
00155 inline sSclAddVec operator+(const sSclVec &au, const cVector &v)
00156 {
00157 return(sSclAddVec(au, v));
00158 }
00159
00160 inline sSclAddVec operator+(const cVector &v, const sSclVec &au)
00161 {
00162 return(sSclAddVec(au, v));
00163 }
00164
00165 struct sSclSubVec
00166 {
00167 const sSclVec ∏
00168 const cVector &rvec;
00169 sSclSubVec(const sSclVec &au, const cVector &v) : prod(au), rvec(v) { }
00170 };
00171
00172 inline sSclSubVec operator-(const sSclVec &au, const cVector &v)
00173 {
00174 return(sSclSubVec(au, v));
00175 }
00176
00177 struct sMatVec
00178 {
00179 const cMatrix &mat;
00180 const cVector &vec;
00181 sMatVec(const cMatrix &A, const cVector &u) : mat(A), vec(u) { }
00182 };
00183
00184 inline sMatVec operator*(const cMatrix &A, const cVector &u)
00185 {
00186 return(sMatVec(A, u));
00187 }
00188
00189 struct sTrnMatVec
00190 {
00191 const cMatrix &mat;
00192 const cVector &vec;
00193 sTrnMatVec(const cMatrix &A, const cVector &u) : mat(A), vec(u) { }
00194 };
00195
00196 inline sTrnMatVec operator*(const sTrnMat &At, const cVector &u)
00197 {
00198 return(sTrnMatVec(At.mat, u));
00199 }
00200
00201 struct sSysMatVec
00202 {
00203 cSysMatrix *mat;
00204 const cVector &vec;
00205 sSysMatVec(cSysMatrix *S, const cVector &u) : mat(S), vec(u) { }
00206 };
00207
00208 inline sSysMatVec operator*(cSysMatrix *S, const cVector &u)
00209 {
00210 return(sSysMatVec(S, u));
00211 }
00212
00213
00214
00215
00216 class cVector
00217 {
00218 private:
00219 int dim;
00220 double *val;
00221
00222 public:
00223 cVector (void);
00224 cVector (int);
00225 cVector (int, double *);
00226 cVector (const cVector &);
00227 ~cVector (void);
00228 int Dim (void) { return dim; }
00229 double* Val (void) { return val; }
00230 void Zero (void) { VecZero(dim, val); }
00231 double Length (void) { return VecLen(dim, val); }
00232 void Resize (int );
00233 void Print (const char *fmt);
00234 double& operator[](int i) { return val[i]; }
00235 double& operator()(int i) { return val[i]; }
00236 cVector& operator= (const cVector &);
00237 cVector& operator= (const double &);
00238 cVector& operator= (const sSclVec &);
00239 cVector& operator+=(const sSclVec &);
00240 cVector& operator= (const sAddVec &);
00241 cVector& operator= (const sSubVec &);
00242 cVector& operator= (const sDivVec &);
00243 cVector& operator= (const sSclAddVec &);
00244 cVector& operator+=(const sSclAddVec &);
00245 cVector& operator= (const sSclSubVec &);
00246 cVector& operator+=(const sSclSubVec &);
00247 cVector& operator= (const sMatVec &);
00248 cVector& operator= (const sTrnMatVec &);
00249 cVector& operator= (const sSysMatVec &);
00250 void operator+=(const cVector &);
00251 void operator-=(const cVector &);
00252 void operator*=(const double &);
00253 void operator/=(const double &);
00254
00255 friend double operator* (const cVector &, const cVector &);
00256 friend void MultTAcc (double, const cMatrix &, const cVector &,
00257 cVector &);
00258 };
00259
00260
00261
00262
00263
00264
00265
00266 #if 1
00267 inline cVector& cVector :: operator=(const cVector &vec)
00268 {
00269 assert(dim == vec.dim);
00270 if (vec.val != val)
00271 VecAssign(dim, vec.val, val);
00272 return(*this);
00273 }
00274 #endif
00275
00276
00277
00278 inline cVector& cVector :: operator=(const double &scl)
00279 {
00280 VecSet(dim, scl, val);
00281 return(*this);
00282 }
00283
00284
00285
00286 inline cVector& cVector :: operator=(const sSclVec &op)
00287 {
00288 assert(dim == op.vec.dim);
00289 VecMul(dim, op.scl, op.vec.val, val);
00290 return(*this);
00291 }
00292
00293
00294
00295 inline cVector& cVector :: operator+=(const sSclVec &op)
00296 {
00297 assert(dim == op.vec.dim);
00298 VecMulAdd(dim, op.scl, op.vec.val, val);
00299 return(*this);
00300 }
00301
00302
00303
00304 inline cVector& cVector :: operator=(const sAddVec &op)
00305 {
00306 assert(dim == op.lvec.dim && dim == op.rvec.dim);
00307 VecAdd(dim, op.lvec.val, op.rvec.val, val);
00308 return(*this);
00309 }
00310
00311
00312
00313 inline cVector& cVector :: operator=(const sSubVec &op)
00314 {
00315 assert(dim == op.lvec.dim && dim == op.rvec.dim);
00316 VecSub(dim, op.lvec.val, op.rvec.val, val);
00317 return(*this);
00318 }
00319
00320
00321
00322 inline cVector& cVector :: operator=(const sDivVec &op)
00323 {
00324 assert(dim == op.lvec.dim && dim == op.rvec.dim);
00325 VecDiv(dim, op.lvec.val, op.rvec.val, val);
00326 return(*this);
00327 }
00328
00329
00330
00331 inline cVector& cVector :: operator=(const sSclAddVec &op)
00332 {
00333 assert(dim == op.prod.vec.dim && dim == op.rvec.dim);
00334 VecSclAdd(dim, op.prod.scl, op.prod.vec.val, op.rvec.val, val);
00335 return(*this);
00336 }
00337
00338
00339
00340 inline cVector& cVector :: operator+=(const sSclAddVec &op)
00341 {
00342 assert(dim == op.prod.vec.dim && dim == op.rvec.dim);
00343 VecSclAddInc(dim, op.prod.scl, op.prod.vec.val, op.rvec.val, val);
00344 return(*this);
00345 }
00346
00347
00348
00349 inline cVector& cVector :: operator=(const sSclSubVec &op)
00350 {
00351 assert(op.prod.vec.dim == op.rvec.dim);
00352 VecSclSub(dim, op.prod.scl, op.prod.vec.val, op.rvec.val, val);
00353 return(*this);
00354 }
00355
00356
00357
00358 inline cVector& cVector :: operator+=(const sSclSubVec &op)
00359 {
00360 assert(op.prod.vec.dim == op.rvec.dim);
00361 VecSclSubInc(dim, op.prod.scl, op.prod.vec.val, op.rvec.val, val);
00362 return(*this);
00363 }
00364
00365
00366
00367 inline cVector& cVector :: operator=(const sMatVec &op)
00368 {
00369 assert(dim == op.mat.nrow && op.mat.ncol == op.vec.dim);
00370 MatVecMult(op.mat.nrow, op.mat.ncol, op.mat.val, op.vec.val, val);
00371 return(*this);
00372 }
00373
00374
00375
00376 inline cVector& cVector :: operator=(const sTrnMatVec &op)
00377 {
00378 assert(dim == op.mat.ncol && op.mat.nrow == op.vec.dim);
00379 MatVecMultT(op.mat.ncol, op.mat.nrow, op.mat.val, op.vec.val, val);
00380 return(*this);
00381 }
00382
00383
00384
00385 inline cVector& cVector :: operator=(const sSysMatVec &op)
00386 {
00387 assert(dim == op.mat->dim && op.mat->dim == op.vec.dim);
00388 op.mat->MultVect(op.vec.val, val);
00389 return(*this);
00390 }
00391
00392
00393
00394 inline void cVector :: operator+=(const cVector &u)
00395 {
00396 assert(dim == u.dim);
00397 VecAdd(dim, u.val, val);
00398 }
00399
00400
00401
00402 inline void cVector :: operator-=(const cVector &u)
00403 {
00404 assert(dim == u.dim);
00405 VecSub(dim, u.val, val);
00406 }
00407
00408
00409
00410 inline double operator*(const cVector &u, const cVector &v)
00411 {
00412 assert(u.dim == v.dim);
00413 return(VecDot(u.dim, u.val, v.val));
00414 }
00415
00416
00417
00418 inline void MultTAcc(double a, const cMatrix &B, const cVector &s,
00419 cVector &g)
00420 {
00421 assert(B.nrow == s.dim);
00422 MatVecMultTAcc(a, B.ncol, B.nrow, B.val, s.val, g.val);
00423 }
00424
00425 #endif