00001
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #ifndef __PDF_MATRIX_TEMPLATE_H__
00027 #define __PDF_MATRIX_TEMPLATE_H__
00028
00029 #include <cstddef>
00030 #include <valarray>
00031 #include <iostream>
00032
00033 namespace pdf {
00034
00035
00036 template<class T> class matrix_template;
00037
00056 template<class T> class vector_template {
00057
00058
00059 public :
00060 vector_template(void);
00061 explicit vector_template(size_t n);
00062 vector_template(const T & val, size_t n);
00063 vector_template(const T* p, size_t n);
00064 explicit vector_template(const std::valarray<T> & vv);
00065
00066
00067 public :
00068 size_t size(void) const;
00069
00070
00071
00072 public :
00073 T operator[](size_t i) const;
00074 T & operator[](size_t i);
00075
00076 T operator()(size_t i) const;
00077 T & operator()(size_t i);
00078
00079
00080 template<class TT> friend vector_template<TT> operator+ (const vector_template<TT> & v1, const vector_template<TT> & v2);
00081 template<class TT> friend vector_template<TT> operator- (const vector_template<TT> & v1, const vector_template<TT> & v2);
00082 template<class TT> friend vector_template<TT> operator+ (const vector_template<TT> & v1);
00083 template<class TT> friend vector_template<TT> operator- (const vector_template<TT> & v1);
00084 template<class TT, class SS> friend vector_template<TT> operator* (const SS & c, const vector_template<TT> & v2);
00085 template<class TT, class SS> friend vector_template<TT> operator* (const vector_template<TT> & v1, const SS & c);
00086 template<class TT, class SS> friend vector_template<TT> operator/ (const vector_template<TT> & v1, const SS & c);
00087
00088 template<class TT> friend TT operator* (const vector_template<TT> & v1, const vector_template<TT> & v2);
00089 template<class TT> friend vector_template<TT> operator* (const matrix_template<TT> & v1, const vector_template<TT> & v2);
00090 template<class TT> friend vector_template<TT> operator* (const vector_template<TT> & v1, const matrix_template<TT> & v2);
00091
00092
00093 template<class TT> friend std::ostream & operator<< (std::ostream & os, const vector_template<TT> & v);
00094
00095
00096 protected :
00097 std::valarray<T> v;
00098
00099 };
00100
00118 template<class T> class matrix_template {
00119
00120
00121 public :
00122 matrix_template(void);
00123 matrix_template(size_t n, size_t m);
00124 matrix_template(const T & val, size_t n, size_t m);
00125 matrix_template(const T* p, size_t n, size_t m);
00126 matrix_template(const std::valarray<T> & vv, size_t n, size_t m);
00127
00128
00129 public :
00130 size_t rows(void) const;
00131 size_t columns(void) const;
00132
00133
00134
00135 public :
00136 T operator()(size_t i, size_t j) const;
00137 T & operator()(size_t i, size_t j);
00138
00139
00140 template<class TT> friend matrix_template<TT> operator+ (const matrix_template<TT> & v1, const matrix_template<TT> & v2);
00141 template<class TT> friend matrix_template<TT> operator- (const matrix_template<TT> & v1, const matrix_template<TT> & v2);
00142 template<class TT> friend matrix_template<TT> operator+ (const matrix_template<TT> & v1);
00143 template<class TT> friend matrix_template<TT> operator- (const matrix_template<TT> & v1);
00144 template<class TT, class SS> friend matrix_template<TT> operator* (const SS & c, const matrix_template<TT> & v2);
00145 template<class TT, class SS> friend matrix_template<TT> operator* (const matrix_template<TT> & v1, const SS & c);
00146 template<class TT, class SS> friend matrix_template<TT> operator/ (const matrix_template<TT> & v1, const SS & c);
00147
00148 template<class TT> friend matrix_template<TT> operator* (const matrix_template<TT> & v1, const matrix_template<TT> & v2);
00149 template<class TT> friend vector_template<TT> operator* (const matrix_template<TT> & v1, const vector_template<TT> & v2);
00150 template<class TT> friend vector_template<TT> operator* (const vector_template<TT> & v1, const matrix_template<TT> & v2);
00151
00152
00153 template<class TT> friend std::ostream & operator<< (std::ostream & os, const matrix_template<TT> & v);
00154
00155
00156 protected :
00158 size_t nrows;
00160 size_t ncols;
00161 std::valarray<T> v;
00162
00163 };
00164
00165
00166
00167
00168
00169
00170
00176 template<class T> inline vector_template<T>::vector_template(void) : v()
00177 {}
00178
00184 template<class T> inline vector_template<T>::vector_template(size_t n) : v(n)
00185 {}
00186
00192 template<class T> inline vector_template<T>::vector_template(const T & val, size_t n) : v(val, n)
00193 {}
00194
00200 template<class T> inline vector_template<T>::vector_template(const T* p, size_t n) : v(p,n)
00201 {}
00202
00208 template<class T> inline vector_template<T>::vector_template(const std::valarray<T> & vv) : v(vv)
00209 {}
00210
00211
00212
00218 template<class T> inline size_t vector_template<T>::size(void) const
00219 {
00220 return v.size();
00221 }
00222
00223
00224
00230 template<class T> inline T vector_template<T>::operator[](size_t i) const
00231 {
00232 return v[i];
00233 }
00234
00240 template<class T> inline T & vector_template<T>::operator[](size_t i)
00241 {
00242 return v[i];
00243 }
00244
00250 template<class T> inline T vector_template<T>::operator()(size_t i) const
00251 {
00252 return v[i];
00253 }
00254
00260 template<class T> inline T & vector_template<T>::operator()(size_t i)
00261 {
00262 return v[i];
00263 }
00264
00265
00266
00267
00268
00277 template<class T> inline vector_template<T> operator+ (const vector_template<T> & v1, const vector_template<T> & v2)
00278 {
00279 return vector_template<T>(v1.v+v2.v);
00280 }
00281
00290 template<class T> inline vector_template<T> operator- (const vector_template<T> & v1, const vector_template<T> & v2)
00291 {
00292 return vector_template<T>(v1.v-v2.v);
00293 }
00294
00303 template<class T> inline vector_template<T> operator+ (const vector_template<T> & v1)
00304 {
00305 return vector_template<T>(+v1.v);
00306 }
00307
00316 template<class T> inline vector_template<T> operator- (const vector_template<T> & v1)
00317 {
00318 return vector_template<T>(-v1.v);
00319 }
00320
00329 template<class T, class S> inline vector_template<T> operator* (const S & c, const vector_template<T> & v2)
00330 {
00331 T cc = c;
00332 return vector_template<T>( cc*v2.v);
00333 }
00334
00343 template<class T, class S> inline vector_template<T> operator* (const vector_template<T> & v1, const S & c)
00344 {
00345 T cc = c;
00346 return vector_template<T>(v1.v*cc);
00347 }
00348
00357 template<class T, class S> inline vector_template<T> operator/ (const vector_template<T> & v1, const S & c)
00358 {
00359 T cc = c;
00360 return vector_template<T>(v1.v/cc);
00361 }
00362
00371 template<class T> inline T operator* (const vector_template<T> & v1, const vector_template<T> & v2)
00372 {
00373 T res = 0;
00374 for ( size_t i=0; i<v1.size(); i++) res += v1(i)*v2(i);
00375
00376 return res;
00377 }
00378
00379
00380
00386 template<class T> inline std::ostream & operator<< (std::ostream & os, const vector_template<T> & v)
00387 {
00388 os << "[";
00389 for ( size_t i=0; i<v.size(); i++)
00390 {
00391 if (i>0) os << ",";
00392 os << v(i);
00393 }
00394
00395 return os << "]";
00396 }
00397
00398
00399
00400
00401
00402
00408 template<class T> inline matrix_template<T>::matrix_template(void) : nrows(), ncols(), v()
00409 {}
00410
00416 template<class T> inline matrix_template<T>::matrix_template(size_t n, size_t m) : nrows(n), ncols(m), v(n*m)
00417 {}
00418
00424 template<class T> inline matrix_template<T>::matrix_template(const T & val, size_t n, size_t m) :
00425 nrows(n), ncols(m), v(val, n*m)
00426 {}
00427
00433 template<class T> inline matrix_template<T>::matrix_template(const T* p, size_t n, size_t m) :
00434 nrows(n), ncols(m), v(p,n*m)
00435 {}
00436
00442 template<class T> inline matrix_template<T>::matrix_template(const std::valarray<T> & vv, size_t n, size_t m) :
00443 nrows(n), ncols(m), v(vv)
00444 {}
00445
00446
00447
00453 template<class T> inline size_t matrix_template<T>::rows(void) const
00454 {
00455 return nrows;
00456 }
00457
00463 template<class T> inline size_t matrix_template<T>::columns(void) const
00464 {
00465 return ncols;
00466 }
00467
00468
00469
00475 template<class T> inline T matrix_template<T>::operator()(size_t i, size_t j) const
00476 {
00477
00478 return v[i*ncols+j];
00479 }
00480
00486 template<class T> inline T & matrix_template<T>::operator()(size_t i, size_t j)
00487 {
00488
00489 return v[i*ncols+j];
00490 }
00491
00492
00493
00494
00495
00504 template<class T> inline matrix_template<T> operator+ (const matrix_template<T> & v1, const matrix_template<T> & v2)
00505 {
00506 return matrix_template<T>(v1.v+v2.v, v1.nrows, v1.ncols);
00507 }
00508
00517 template<class T> inline matrix_template<T> operator- (const matrix_template<T> & v1, const matrix_template<T> & v2)
00518 {
00519 return matrix_template<T>(v1.v-v2.v, v1.nrows, v1.ncols);
00520 }
00521
00530 template<class T> inline matrix_template<T> operator+ (const matrix_template<T> & v1)
00531 {
00532 return matrix_template<T>(+v1.v, v1.nrows, v1.ncols);
00533 }
00534
00543 template<class T> inline matrix_template<T> operator- (const matrix_template<T> & v1)
00544 {
00545 return matrix_template<T>(-v1.v, v1.nrows, v1.ncols);
00546 }
00547
00556 template<class T, class S> inline matrix_template<T> operator* (const S & c, const matrix_template<T> & v2)
00557 {
00558 T cc = c;
00559 return matrix_template<T>(cc*v2.v, v2.nrows, v2.ncols);
00560 }
00561
00570 template<class T, class S> inline matrix_template<T> operator* (const matrix_template<T> & v1, const S & c)
00571 {
00572 T cc = c;
00573 return matrix_template<T>(v1.v*cc, v1.nrows, v1.ncols);
00574 }
00575
00584 template<class T, class S> inline matrix_template<T> operator/ (const matrix_template<T> & v1, const S & c)
00585 {
00586 T cc = c;
00587 return matrix_template<T>(v1.v/cc, v1.nrows, v1.ncols);
00588 }
00589
00598 template<class T> inline matrix_template<T> operator* (const matrix_template<T> & v1, const matrix_template<T> & v2)
00599 {
00600 std::valarray<T> res(v1.nrows*v2.ncols);
00601
00602 for ( size_t i=0; i<v1.nrows; i++)
00603 {
00604 for ( size_t j=0; j<v2.ncols; j++)
00605 {
00606 T res_scal = 0;
00607 for ( size_t k=0; k<v1.ncols; k++) res_scal += v1.v[i*v1.ncols+k]*v2.v[k*v2.ncols+j];
00608 res[i*v2.ncols+j] = res_scal;
00609 }
00610 }
00611
00612 return matrix_template<T>(res, v1.nrows, v2.ncols);
00613 }
00614
00623 template<class T> inline vector_template<T> operator* (const matrix_template<T> & v1, const vector_template<T> & v2)
00624 {
00625 std::valarray<T> res(v1.nrows);
00626
00627 for ( size_t i=0; i<v1.nrows; i++)
00628 {
00629 T res_scal = 0;
00630 for ( size_t k=0; k<v1.ncols; k++) res_scal += v1.v[i*v1.ncols+k]*v2.v[k];
00631 res[i] = res_scal;
00632 }
00633
00634 return vector_template<T>(res);
00635 }
00636
00645 template<class T> inline vector_template<T> operator* (const vector_template<T> & v1, const matrix_template<T> & v2)
00646 {
00647 std::valarray<T> res(v2.ncols);
00648
00649 for ( size_t j=0; j<v2.ncols; j++)
00650 {
00651 T res_scal = 0;
00652 for ( size_t k=0; k<v2.nrows; k++) res_scal += v1.v[k]*v2.v[k*v2.ncols+j];
00653 res[j] = res_scal;
00654 }
00655
00656 return vector_template<T>(res);
00657 }
00658
00659
00660
00666 template<class T> inline std::ostream & operator<< (std::ostream & os, const matrix_template<T> & v)
00667 {
00668 os << "[";
00669 for ( size_t i=0; i<v.rows(); i++)
00670 {
00671 if (i>0) os << ",";
00672 os << "[";
00673 for ( size_t j=0; j<v.columns(); j++)
00674 {
00675 if (j>0) os << ",";
00676 os << v(i,j);
00677 }
00678 os << "]";
00679 }
00680
00681 return os << "]";
00682 }
00683
00684
00685
00686 }
00687
00688 #endif // ndef __PDF_MATRIX_TEMPLATE_H__
00689