00001 00031 #ifndef OPERATORS_H 00032 #define OPERATORS_H 00033 00034 #include <itpp/base/vec.h> 00035 #include <itpp/base/mat.h> 00036 #include <itpp/base/converters.h> 00037 00038 00039 namespace itpp 00040 { 00041 00042 //---------------------- between scalars and complex<double> ----------------- 00044 inline std::complex<double> operator+(const int &x, const std::complex<double> &y) {return std::complex<double>(x + y.real(), x + y.imag());} 00046 inline std::complex<double> operator+(const float &x, const std::complex<double> &y) {return std::complex<double>(x + y.real(), x + y.imag());} 00048 inline std::complex<double> operator+(const std::complex<double> &x, const int &y) {return std::complex<double>(x.real() + y, x.imag() + y);} 00050 inline std::complex<double> operator+(const std::complex<double> &x, const float &y) {return std::complex<double>(x.real() + y, x.imag() + y);} 00051 00053 inline std::complex<double> operator-(const int &x, const std::complex<double> &y) {return std::complex<double>(x - y.real(), x - y.imag());} 00055 inline std::complex<double> operator-(const float &x, const std::complex<double> &y) {return std::complex<double>(x - y.real(), x - y.imag());} 00057 inline std::complex<double> operator-(const std::complex<double> &x, const int &y) {return std::complex<double>(x.real() - y, x.imag() - y);} 00059 inline std::complex<double> operator-(const std::complex<double> &x, const float &y) {return std::complex<double>(x.real() - y, x.imag() - y);} 00060 00062 inline std::complex<double> operator*(const int &x, const std::complex<double> &y) {return std::complex<double>(x*y.real(), x*y.imag());} 00064 inline std::complex<double> operator*(const float &x, const std::complex<double> &y) {return std::complex<double>(x*y.real(), x*y.imag());} 00066 inline std::complex<double> operator*(const std::complex<double> &x, const int &y) {return std::complex<double>(x.real()*y, x.imag()*y);} 00068 inline std::complex<double> operator*(const std::complex<double> &x, const float &y) {return std::complex<double>(x.real()*y, x.imag()*y);} 00069 00071 inline std::complex<double> operator/(const std::complex<double> &x, const int &y) {return std::complex<double>(x.real() / y, x.imag() / y);} 00073 inline std::complex<double> operator/(const std::complex<double> &x, const float &y) {return std::complex<double>(x.real() / y, x.imag() / y);} 00074 00075 00076 //---------------------- between vec and scalar -------------------- 00077 00082 inline vec operator+(const float &s, const vec &v) {return static_cast<double>(s) + v;} 00083 00088 inline vec operator+(const short &s, const vec &v) {return static_cast<double>(s) + v;} 00089 00094 inline vec operator+(const int &s, const vec &v) {return static_cast<double>(s) + v;} 00095 00100 inline vec operator+(const vec &v, const float &s) {return static_cast<double>(s) + v;} 00101 00106 inline vec operator+(const vec &v, const short &s) {return static_cast<double>(s) + v;} 00107 00112 inline vec operator+(const vec &v, const int &s) {return static_cast<double>(s) + v;} 00113 00118 inline vec operator-(const float &s, const vec &v) {return static_cast<double>(s) - v;} 00119 00124 inline vec operator-(const short &s, const vec &v) {return static_cast<double>(s) - v;} 00125 00130 inline vec operator-(const int &s, const vec &v) {return static_cast<double>(s) - v;} 00131 00136 inline vec operator-(const vec &v, const float &s) {return v -static_cast<double>(s);} 00137 00142 inline vec operator-(const vec &v, const short &s) {return v -static_cast<double>(s);} 00143 00148 inline vec operator-(const vec &v, const int &s) {return v -static_cast<double>(s);} 00149 00154 inline vec operator*(const float &s, const vec &v) {return static_cast<double>(s)*v;} 00155 00160 inline vec operator*(const short &s, const vec &v) {return static_cast<double>(s)*v;} 00161 00166 inline vec operator*(const int &s, const vec &v) {return static_cast<double>(s)*v;} 00167 00172 cvec operator*(const std::complex<double> &s, const vec &v); 00173 00178 inline vec operator*(const vec &v, const float &s) {return static_cast<double>(s)*v;} 00179 00184 inline vec operator*(const vec &v, const short &s) {return static_cast<double>(s)*v;} 00185 00190 inline vec operator*(const vec &v, const int &s) {return static_cast<double>(s)*v;} 00191 00196 cvec operator*(const vec &v, const std::complex<double> &s); 00197 00202 inline vec operator/(const vec &v, const float &s) {return v / static_cast<double>(s);} 00203 00208 inline vec operator/(const vec &v, const short &s) {return v / static_cast<double>(s);} 00209 00214 inline vec operator/(const vec &v, const int &s) {return v / static_cast<double>(s);} 00215 00216 00217 //---------------------- between ivec and scalar -------------------- 00218 00223 vec operator+(const double &s, const ivec &v); 00224 00229 inline vec operator+(const ivec &v, const double &s) { return s + v;} 00230 00235 vec operator-(const double &s, const ivec &v); 00236 00241 inline vec operator-(const ivec &v, const double &s) { return v + (-s); } 00242 00247 vec operator*(const double &s, const ivec &v); 00248 00253 inline vec operator*(const ivec &v, const double &s) { return s*v; } 00254 00259 vec operator/(const double &s, const ivec &v); 00260 00265 vec operator/(const ivec &v, const double &s); 00266 00271 cvec operator+(const std::complex<double> &s, const ivec &v); 00272 00277 inline cvec operator+(const ivec &v, const std::complex<double> &s) { return s + v;} 00278 00283 cvec operator-(const std::complex<double> &s, const ivec &v); 00284 00289 inline cvec operator-(const ivec &v, const std::complex<double> &s) { return v + (-s); } 00290 00295 cvec operator*(const std::complex<double> &s, const ivec &v); 00296 00301 inline cvec operator*(const ivec &v, const std::complex<double> &s) { return s*v; } 00302 00307 cvec operator/(const std::complex<double> &s, const ivec &v); 00308 00313 cvec operator/(const ivec &v, const std::complex<double> &s); 00314 00315 //---------------------- between cvec and scalar -------------------- 00316 00321 cvec operator+(const double &s, const cvec &v); 00322 00327 inline cvec operator+(const float &s, const cvec &v) {return static_cast<double>(s) + v;} 00328 00333 inline cvec operator+(const short &s, const cvec &v) {return static_cast<double>(s) + v;} 00334 00339 inline cvec operator+(const int &s, const cvec &v) {return static_cast<double>(s) + v;} 00340 00345 inline cvec operator+(const cvec &v, const float &s) {return s + v;} 00346 00351 inline cvec operator+(const cvec &v, const double &s) {return s + v;} 00352 00357 inline cvec operator+(const cvec &v, const short &s) {return s + v;} 00358 00363 inline cvec operator+(const cvec &v, const int &s) {return s + v;} 00364 00369 cvec operator-(const double &s, const cvec &v); 00370 00375 inline cvec operator-(const float &s, const cvec &v) {return static_cast<double>(s) - v;} 00376 00381 inline cvec operator-(const short &s, const cvec &v) {return static_cast<double>(s) - v;} 00382 00387 inline cvec operator-(const int &s, const cvec &v) {return static_cast<double>(s) - v;} 00388 00393 inline cvec operator-(const cvec &v, const float &s) {return v + (-s);} 00394 00399 inline cvec operator-(const cvec &v, const double &s) {return v + (-s);} 00400 00405 inline cvec operator-(const cvec &v, const short &s) {return v + (-s);} 00406 00411 inline cvec operator-(const cvec &v, const int &s) {return v + (-s);} 00412 00417 cvec operator*(const double &s, const cvec &v); 00418 00423 inline cvec operator*(const float &s, const cvec &v) {return static_cast<double>(s)*v;} 00424 00429 inline cvec operator*(const short &s, const cvec &v) {return static_cast<double>(s)*v;} 00430 00435 inline cvec operator*(const int &s, const cvec &v) {return static_cast<double>(s)*v;} 00436 00441 inline cvec operator*(const cvec &v, const float &s) {return s*v;} 00442 00447 inline cvec operator*(const cvec &v, const double &s) {return s*v;} 00448 00453 inline cvec operator*(const cvec &v, const short &s) {return s*v;} 00454 00459 inline cvec operator*(const cvec &v, const int &s) {return s*v;} 00460 00465 cvec operator/(const cvec &v, const double &s); 00466 00471 cvec operator/(const double &s, const cvec &v); 00472 00477 inline cvec operator/(const cvec &v, const float &s) {return v / static_cast<double>(s);} 00478 00483 inline cvec operator/(const cvec &v, const short &s) {return v / static_cast<double>(s);} 00484 00489 inline cvec operator/(const cvec &v, const int &s) {return v / static_cast<double>(s);} 00490 00491 //---------------------- between mat and scalar -------------------- 00492 00497 inline mat operator+(const float &s, const mat &m) {return static_cast<double>(s) + m;} 00498 00503 inline mat operator+(const short &s, const mat &m) {return static_cast<double>(s) + m;} 00504 00509 inline mat operator+(const int &s, const mat &m) {return static_cast<double>(s) + m;} 00510 00515 inline mat operator+(const mat &m, const float &s) {return static_cast<double>(s) + m;} 00516 00521 inline mat operator+(const mat &m, const short &s) {return static_cast<double>(s) + m;} 00522 00527 inline mat operator+(const mat &m, const int &s) {return static_cast<double>(s) + m;} 00528 00533 inline mat operator-(const float &s, const mat &m) {return static_cast<double>(s) - m;} 00534 00539 inline mat operator-(const short &s, const mat &m) {return static_cast<double>(s) - m;} 00540 00545 inline mat operator-(const int &s, const mat &m) {return static_cast<double>(s) - m;} 00546 00551 inline mat operator-(const mat &m, const float &s) {return m -static_cast<double>(s);} 00552 00557 inline mat operator-(const mat &m, const short &s) {return m -static_cast<double>(s);} 00558 00563 inline mat operator-(const mat &m, const int &s) {return m -static_cast<double>(s);} 00564 00569 inline mat operator*(const float &s, const mat &m) {return static_cast<double>(s)*m;} 00570 00575 inline mat operator*(const short &s, const mat &m) {return static_cast<double>(s)*m;} 00576 00581 inline mat operator*(const int &s, const mat &m) {return static_cast<double>(s)*m;} 00582 00587 inline mat operator*(const mat &m, const float &s) {return static_cast<double>(s)*m;} 00588 00593 inline mat operator*(const mat &m, const short &s) {return static_cast<double>(s)*m;} 00594 00599 inline mat operator*(const mat &m, const int &s) {return static_cast<double>(s)*m;} 00600 00605 inline mat operator/(const mat &m, const float &s) {return m / static_cast<double>(s);} 00606 00611 inline mat operator/(const mat &m, const short &s) {return m / static_cast<double>(s);} 00612 00617 inline mat operator/(const mat &m, const int &s) {return m / static_cast<double>(s);} 00618 00619 //---------------------- between cmat and scalar -------------------- 00620 00625 cmat operator+(const double &s, const cmat &m); 00626 00631 cmat operator-(const double &s, const cmat &m); 00632 00637 cmat operator*(const double &s, const cmat &m); 00638 00643 cmat operator*(const std::complex<double> &s, const mat &m); 00644 00649 inline cmat operator*(const mat &m, const std::complex<double> &s) {return s*m;} 00650 00655 cmat operator/(const cmat &m, const double &s); 00656 00657 //---------------------- between vec and vectors -------------------- 00658 00663 vec operator+(const bvec &a, const vec &b); 00664 00669 vec operator+(const svec &a, const vec &b); 00670 00675 vec operator+(const ivec &a, const vec &b); 00676 00681 inline vec operator+(const vec &a, const bvec &b) {return b + a;} 00682 00687 inline vec operator+(const vec &a, const svec &b) {return b + a;} 00688 00693 inline vec operator+(const vec &a, const ivec &b) {return b + a;} 00694 00699 inline vec operator-(const bvec &a, const vec &b) {return a + (-b);} 00700 00705 inline vec operator-(const svec &a, const vec &b) {return a + (-b);} 00706 00711 inline vec operator-(const ivec &a, const vec &b) {return a + (-b);} 00712 00717 inline vec operator-(const vec &a, const bvec &b) {return a + (-b);} 00718 00723 inline vec operator-(const vec &a, const svec &b) {return a + (-b);} 00724 00729 inline vec operator-(const vec &a, const ivec &b) {return a + (-b);} 00730 00735 double operator*(const bvec &a, const vec &b); 00736 00741 double operator*(const svec &a, const vec &b); 00742 00747 double operator*(const ivec &a, const vec &b); 00748 00753 inline double operator*(const vec &a, const bvec &b) {return b*a;} 00754 00759 inline double operator*(const vec &a, const svec &b) {return b*a;} 00760 00765 inline double operator*(const vec &a, const ivec &b) {return b*a;} 00766 00767 //---------------------- between cvec and vectors -------------------- 00768 00773 cvec operator+(const bvec &a, const cvec &b); 00774 00779 cvec operator+(const svec &a, const cvec &b); 00780 00785 cvec operator+(const ivec &a, const cvec &b); 00786 00791 inline cvec operator+(const cvec &a, const bvec &b) {return b + a;} 00792 00797 inline cvec operator+(const cvec &a, const svec &b) {return b + a;} 00798 00803 inline cvec operator+(const cvec &a, const ivec &b) {return b + a;} 00804 00809 inline cvec operator-(const bvec &a, const cvec &b) {return a + (-b);} 00810 00815 inline cvec operator-(const svec &a, const cvec &b) {return a + (-b);} 00816 00821 inline cvec operator-(const ivec &a, const cvec &b) {return a + (-b);} 00822 00827 inline cvec operator-(const cvec &a, const bvec &b) {return a + (-b);} 00828 00833 inline cvec operator-(const cvec &a, const svec &b) {return a + (-b);} 00834 00839 inline cvec operator-(const cvec &a, const ivec &b) {return a + (-b);} 00840 00845 std::complex<double> operator*(const bvec &a, const cvec &b); 00846 00851 std::complex<double> operator*(const svec &a, const cvec &b); 00852 00857 std::complex<double> operator*(const ivec &a, const cvec &b); 00858 00863 inline std::complex<double> operator*(const cvec &a, const bvec &b) {return b*a;} 00864 00869 inline std::complex<double> operator*(const cvec &a, const svec &b) {return b*a;} 00870 00875 inline std::complex<double> operator*(const cvec &a, const ivec &b) {return b*a;} 00876 00877 //---------------------- between mat and matricies -------------------- 00878 00883 mat operator+(const bmat &a, const mat &b); 00884 00889 mat operator+(const smat &a, const mat &b); 00890 00895 mat operator+(const imat &a, const mat &b); 00896 00901 inline mat operator+(const mat &a, const bmat &b) {return b + a;} 00902 00907 inline mat operator+(const mat &a, const smat &b) {return b + a;} 00908 00913 inline mat operator+(const mat &a, const imat &b) {return b + a;} 00914 00919 inline mat operator-(const bmat &a, const mat &b) {return a + (-b);} 00920 00925 inline mat operator-(const smat &a, const mat &b) {return a + (-b);} 00926 00931 inline mat operator-(const imat &a, const mat &b) {return a + (-b);} 00932 00937 inline mat operator-(const mat &a, const bmat &b) {return a + (-b);} 00938 00943 inline mat operator-(const mat &a, const smat &b) {return a + (-b);} 00944 00949 inline mat operator-(const mat &a, const imat &b) {return a + (-b);} 00950 00951 //---------------------- between cmat and matricies -------------------- 00952 00957 cmat operator+(const bmat &a, const cmat &b); 00958 00963 cmat operator+(const smat &a, const cmat &b); 00964 00969 cmat operator+(const imat &a, const cmat &b); 00970 00975 cmat operator+(const mat &a, const cmat &b); 00976 00981 inline cmat operator+(const cmat &a, const bmat &b) {return b + a;} 00982 00987 inline cmat operator+(const cmat &a, const smat &b) {return b + a;} 00988 00993 inline cmat operator+(const cmat &a, const imat &b) {return b + a;} 00994 00999 inline cmat operator+(const cmat &a, const mat &b) {return b + a;} 01000 01005 inline cmat operator-(const bmat &a, const cmat &b) {return a + (-b);} 01006 01011 inline cmat operator-(const smat &a, const cmat &b) {return a + (-b);} 01012 01017 inline cmat operator-(const imat &a, const cmat &b) {return a + (-b);} 01018 01023 inline cmat operator-(const mat &a, const cmat &b) {return a + (-b);} 01024 01029 inline cmat operator-(const cmat &a, const bmat &b) {return a + (-b);} 01030 01035 inline cmat operator-(const cmat &a, const smat &b) {return a + (-b);} 01036 01041 inline cmat operator-(const cmat &a, const imat &b) {return a + (-b);} 01042 01047 inline cmat operator-(const cmat &a, const mat &b) {return a + (-b);} 01048 01053 inline cmat operator*(const mat &a, const cmat &b) {return to_cmat(a)*b;} 01054 01059 inline cmat operator*(const bmat &a, const cmat &b) {return to_cmat(a)*b;} 01060 01065 inline cmat operator*(const smat &a, const cmat &b) {return to_cmat(a)*b;} 01066 01071 inline cmat operator*(const imat &a, const cmat &b) {return to_cmat(a)*b;} 01072 01077 inline cmat operator*(const cmat &a, const mat &b) {return a*to_cmat(b);} 01078 01083 inline cmat operator*(const cmat &a, const bmat &b) {return a*to_cmat(b);} 01084 01089 inline cmat operator*(const cmat &a, const smat &b) {return a*to_cmat(b);} 01090 01095 inline cmat operator*(const cmat &a, const imat &b) {return a*to_cmat(b);} 01096 01097 } // namespace itpp 01098 01099 #endif // #ifndef OPERATORS_H 01100
Generated on Tue Nov 23 08:47:56 2010 for IT++ by Doxygen 1.6.1