IT++ Logo
fix_functions.h
Go to the documentation of this file.
1 
30 #ifndef FIX_FUNCTIONS_H
31 #define FIX_FUNCTIONS_H
32 
33 #include <itpp/fixed/cfix.h>
34 #include <itpp/base/vec.h>
35 #include <itpp/base/mat.h>
36 #include <itpp/base/array.h>
37 #include <itpp/base/converters.h>
38 #include <itpp/itexports.h>
39 
40 
41 namespace itpp
42 {
43 
46 
48 template<class T> inline bool is_fix(const T &) {return false;}
50 template<> inline bool is_fix(const Fix &) {return true;}
52 template<> inline bool is_fix(const fixvec &) {return true;}
54 template<> inline bool is_fix(const fixmat &) {return true;}
56 template<> inline bool is_fix(const CFix &) {return true;}
58 template<> inline bool is_fix(const cfixvec &) {return true;}
60 template<> inline bool is_fix(const cfixmat &) {return true;}
62 template<class T> inline bool is_fix(const Array<T> &) {return is_fix(T());}
63 
65 inline void set_fix(Fix &y, double x, int n) {y.set(x, n);}
67 inline void set_fix(Fix &y, double x, int n, q_mode q) {y.set(x, n, q);}
69 inline void set_fix(fixvec &y, const vec &x, int n)
70 {
71  y.set_size(x.length());
72  for (int i = 0; i < y.size(); i++) y(i).set(x(i), n);
73 }
75 inline void set_fix(fixvec &y, const vec &x, int n, q_mode q)
76 {
77  y.set_size(x.length());
78  for (int i = 0; i < y.size(); i++) y(i).set(x(i), n, q);
79 }
81 inline void set_fix(fixmat &y, const mat &x, int n)
82 {
83  y.set_size(x.rows(), x.cols());
84  for (int i = 0; i < y.size(); i++) y(i).set(x(i), n);
85 }
87 inline void set_fix(fixmat &y, const mat &x, int n, q_mode q)
88 {
89  y.set_size(x.rows(), x.cols());
90  for (int i = 0; i < y.size(); i++) y(i).set(x(i), n, q);
91 }
93 inline void set_fix(double &y, double x, int) {y = x;}
95 inline void set_fix(double &y, double x, int, q_mode) {y = x;}
97 inline void set_fix(vec &y, const vec &x, int) {y = x;}
99 inline void set_fix(vec &y, const vec &x, int, q_mode) {y = x;}
101 inline void set_fix(mat &y, const mat &x, int) {y = x;}
103 inline void set_fix(mat &y, const mat &x, int, q_mode) {y = x;}
104 
106 inline void set_fix(CFix &y, std::complex<double> x, int n) {y.set(x, n);}
108 inline void set_fix(CFix &y, double real, double imag, int n) {y.set(real, imag, n);}
110 inline void set_fix(CFix &y, std::complex<double> x, int n, q_mode q) {y.set(x, n, q);}
112 inline void set_fix(CFix &y, double real, double imag, int n, q_mode q) {y.set(real, imag, n, q);}
114 inline void set_fix(cfixvec &y, const cvec &x, int n)
115 {
116  y.set_size(x.length());
117  for (int i = 0; i < y.size(); i++) y(i).set(x(i), n);
118 }
120 inline void set_fix(cfixvec &y, const vec &real, const vec &imag, int n)
121 {
122  it_assert_debug(real.length() == imag.length(), "set_fix: real and imag should have the same size");
123  y.set_size(real.length());
124  for (int i = 0; i < y.size(); i++) y(i).set(real(i), imag(i), n);
125 }
127 inline void set_fix(cfixvec &y, const cvec &x, int n, q_mode q)
128 {
129  y.set_size(x.length());
130  for (int i = 0; i < y.size(); i++) y(i).set(x(i), n, q);
131 }
133 inline void set_fix(cfixvec &y, const vec &real, const vec &imag, int n, q_mode q)
134 {
135  it_assert_debug(real.length() == imag.length(), "set_fix: real and imag should have the same size");
136  y.set_size(real.length());
137  for (int i = 0; i < y.size(); i++) y(i).set(real(i), imag(i), n, q);
138 }
140 inline void set_fix(cfixmat &y, const cmat &x, int n)
141 {
142  y.set_size(x.rows(), x.cols());
143  for (int i = 0; i < y.size(); i++) y(i).set(x(i), n);
144 }
146 inline void set_fix(cfixmat &y, const mat &real, const mat &imag, int n)
147 {
148  it_assert_debug(real.rows() == imag.rows() && real.cols() == imag.cols(), "set_fix: real and imag should have the same size");
149  y.set_size(real.rows(), real.cols());
150  for (int i = 0; i < y.size(); i++) y(i).set(real(i), imag(i), n);
151 }
153 inline void set_fix(cfixmat &y, const cmat &x, int n, q_mode q)
154 {
155  y.set_size(x.rows(), x.cols());
156  for (int i = 0; i < y.size(); i++) y(i).set(x(i), n, q);
157 }
159 inline void set_fix(cfixmat &y, const mat &real, const mat &imag, int n, q_mode q)
160 {
161  it_assert_debug(real.rows() == imag.rows() && real.cols() == imag.cols(), "set_fix: real and imag should have the same size");
162  y.set_size(real.rows(), real.cols());
163  for (int i = 0; i < y.size(); i++) y(i).set(real(i), imag(i), n, q);
164 }
166 inline void set_fix(std::complex<double> &y, const std::complex<double> &x, int) {y = x;}
168 inline void set_fix(std::complex<double> &y, double real, double imag, int) {y = std::complex<double>(real, imag);}
170 inline void set_fix(std::complex<double> &y, const std::complex<double> &x, int, q_mode) {y = x;}
172 inline void set_fix(std::complex<double> &y, double real, double imag, int, q_mode) {y = std::complex<double>(real, imag);}
174 inline void set_fix(cvec &y, const cvec &x, int) {y = x;}
176 inline void set_fix(cvec &y, const vec &real, const vec &imag, int) {y = to_cvec(real, imag);}
178 inline void set_fix(cvec &y, const cvec &x, int, q_mode) {y = x;}
180 inline void set_fix(cvec &y, const vec &real, const vec &imag, int, q_mode) {y = to_cvec(real, imag);}
182 inline void set_fix(cmat &y, const cmat &x, int) {y = x;}
184 inline void set_fix(cmat &y, const mat &real, const mat &imag, int) {y = to_cmat(real, imag);}
186 inline void set_fix(cmat &y, const cmat &x, int, q_mode) {y = x;}
188 inline void set_fix(cmat &y, const mat &real, const mat &imag, int, q_mode) {y = to_cmat(real, imag);}
189 
191 template<class T1, class T2> inline void set_fix(Array<T1> &y, const Array<T2> &x, int n)
192 {
193  y.set_size(x.size());
194  for (int i = 0; i < y.size(); i++) set_fix(y(i), x(i), n);
195 }
197 template<class T1, class T2> inline void set_fix(Array<T1> &y, const Array<T2> &real, const Array<T2> &imag, int n)
198 {
199  it_assert_debug(real.size() == imag.size(), "set_fix: real and imag should have the same size");
200  y.set_size(real.size());
201  for (int i = 0; i < y.size(); i++) set_fix(y(i), real(i), imag(i), n);
202 }
204 template<class T1, class T2> inline void set_fix(Array<T1> &y, const Array<T2> &x, int n, q_mode q)
205 {
206  y.set_size(x.size());
207  for (int i = 0; i < y.size(); i++) set_fix(y(i), x(i), n, q);
208 }
210 template<class T1, class T2> inline void set_fix(Array<T1> &y, const Array<T2> &real, const Array<T2> &imag, int n, q_mode q)
211 {
212  it_assert_debug(real.size() == imag.size(), "set_fix: real and imag should have the same size");
213  y.set_size(real.size());
214  for (int i = 0; i < y.size(); i++) set_fix(y(i), real(i), imag(i), n, q);
215 }
216 
218 inline void lshift_fix(Fix &y, int n) {y.lshift(n);}
220 inline void rshift_fix(Fix &y, int n) {y.rshift(n);}
222 inline void rshift_fix(Fix &y, int n, q_mode q) {y.rshift(n, q);}
224 inline void lshift_fix(fixvec &y, int n)
225 {for(int i = 0; i < y.size(); i++) y(i).lshift(n);}
227 inline void rshift_fix(fixvec &y, int n)
228 {for(int i = 0; i < y.size(); i++) y(i).rshift(n);}
230 inline void rshift_fix(fixvec &y, int n, q_mode q)
231 {for(int i = 0; i < y.size(); i++) y(i).rshift(n, q);}
233 inline void lshift_fix(fixmat &y, int n)
234 {for(int i = 0; i < y.size(); i++) y(i).lshift(n);}
236 inline void rshift_fix(fixmat &y, int n)
237 {for(int i = 0; i < y.size(); i++) y(i).rshift(n);}
239 inline void rshift_fix(fixmat &y, int n, q_mode q)
240 {for(int i = 0; i < y.size(); i++) y(i).rshift(n, q);}
242 inline void lshift_fix(double &, int) {}
244 inline void rshift_fix(double &, int) {}
246 inline void rshift_fix(double &, int, q_mode) {}
248 inline void lshift_fix(vec &, int) {}
250 inline void rshift_fix(vec &, int) {}
252 inline void rshift_fix(vec &, int, q_mode) {}
254 inline void lshift_fix(mat &, int) {}
256 inline void rshift_fix(mat &, int) {}
258 inline void rshift_fix(mat &, int, q_mode) {}
260 inline void lshift_fix(CFix &y, int n) {y.lshift(n);}
262 inline void rshift_fix(CFix &y, int n) {y.rshift(n);}
264 inline void rshift_fix(CFix &y, int n, q_mode q) {y.rshift(n, q);}
266 inline void lshift_fix(cfixvec &y, int n)
267 {for(int i = 0; i < y.size(); i++) y(i).lshift(n);}
269 inline void rshift_fix(cfixvec &y, int n)
270 {for(int i = 0; i < y.size(); i++) y(i).rshift(n);}
272 inline void rshift_fix(cfixvec &y, int n, q_mode q)
273 {for(int i = 0; i < y.size(); i++) y(i).rshift(n, q);}
275 inline void lshift_fix(cfixmat &y, int n)
276 {for(int i = 0; i < y.size(); i++) y(i).lshift(n);}
278 inline void rshift_fix(cfixmat &y, int n)
279 {for(int i = 0; i < y.size(); i++) y(i).rshift(n);}
281 inline void rshift_fix(cfixmat &y, int n, q_mode q)
282 {for(int i = 0; i < y.size(); i++) y(i).rshift(n, q);}
284 inline void lshift_fix(std::complex<double> &, int) {}
286 inline void rshift_fix(std::complex<double> &, int) {}
288 inline void rshift_fix(std::complex<double> &, int, q_mode) {}
290 inline void lshift_fix(cvec &, int) {}
292 inline void rshift_fix(cvec &, int) {}
294 inline void rshift_fix(cvec &, int, q_mode) {}
296 inline void lshift_fix(cmat &, int) {}
298 inline void rshift_fix(cmat &, int) {}
300 inline void rshift_fix(cmat &, int, q_mode) {}
302 template<class T> inline void lshift_fix(Array<T> &y, int n)
303 {for(int i = 0; i < y.size(); i++) lshift_fix(y(i), n);}
305 template<class T> inline void rshift_fix(Array<T> &y, int n)
306 {for(int i = 0; i < y.size(); i++) rshift_fix(y(i), n);}
308 template<class T> inline void rshift_fix(Array<T> &y, int n, q_mode q)
309 {for(int i = 0; i < y.size(); i++) rshift_fix(y(i), n, q);}
310 
312 inline void assert_fixshift(double, int) {}
314 inline void assert_fixshift(const std::complex<double> &, int) {}
316 inline void assert_fixshift(const Fix &x, int shift)
317 {it_assert_debug(x.get_shift() == shift, "Shift should be " + to_str(shift) + " but it is " + to_str(x.get_shift()) + ".");}
319 inline void assert_fixshift(const CFix &x, int shift)
320 {it_assert_debug(x.get_shift() == shift, "Shift should be " + to_str(shift) + " but it is " + to_str(x.get_shift()) + ".");}
321 
323 ITPP_EXPORT vec to_vec(const fixvec &v);
325 ITPP_EXPORT cvec to_cvec(const cfixvec &v);
327 ITPP_EXPORT mat to_mat(const fixmat &m);
329 ITPP_EXPORT cmat to_cmat(const cfixmat &m);
330 
332 
334 template<class T, class U>
335 class ConvertU2T
336 {
337 public:
338  typedef T result;
339 };
341 template<class T, class U>
342 class ConvertU2T<T, Array<U> >
343 {
344 public:
345  typedef Array<typename ConvertU2T<T, U>::result> result; // Recursive
346 };
348 template<class T, class U>
349 class ConvertU2T<T, Vec<U> >
350 {
351 public:
352  typedef Vec<T> result;
353 };
355 template<class T, class U>
356 class ConvertU2T<T, Mat<U> >
357 {
358 public:
359  typedef Mat<T> result;
360 };
361 
363 
365 template<class T> inline T to(double x) {return T(x);}
367 template<class T> inline T to(const Fix &x) {return T(x);}
369 template<class T> inline T to(const std::complex<double> &x) {return T(x);}
371 template<class T> inline T to(const CFix &x) {return T(x);}
373 template<class T> inline T to(double real, double imag) {return T(real, imag);}
375 template<class T> inline T to(const Fix &real, const Fix &imag) {return T(real, imag);}
376 
378 template<class T, class U> Vec<T> to(const Vec<U> &x)
379 {
380  Vec<T> y(x.length());
381  for (int i = 0; i < x.length(); i++) {
382  y(i) = T(x(i));
383  }
384  return y;
385 }
387 template<> inline vec to<double>(const vec &x) {return x;}
389 template<> inline cvec to<std::complex<double> >(const cvec &x) {return x;}
391 template<> inline fixvec to<Fix>(const fixvec &x) {return x;}
393 template<> inline cfixvec to<CFix>(const cfixvec &x) {return x;}
394 
396 template<class T, class U> Vec<T> to(const Vec<U> &real, const Vec<U> &imag)
397 {
398  it_assert_debug(real.length() == imag.length(), "to: real and imag should have the same size");
399  Vec<T> y(real.length());
400  for (int i = 0; i < real.length(); i++) {
401  y(i) = T(real(i), imag(i));
402  }
403  return y;
404 }
405 
407 template<class T, class U> Mat<T> to(const Mat<U> &x)
408 {
409  Mat<T> y(x.rows(), x.cols());
410  for (int i = 0; i < x.rows(); i++) {
411  for (int j = 0; j < x.cols(); j++) {
412  y(i, j) = T(x(i, j));
413  }
414  }
415  return y;
416 }
418 template<> inline mat to<double>(const mat &x) {return x;}
420 template<> inline cmat to<std::complex<double> >(const cmat &x) {return x;}
422 template<> inline fixmat to<Fix>(const fixmat &x) {return x;}
424 template<> inline cfixmat to<CFix>(const cfixmat &x) {return x;}
425 
427 template<class T, class U> Mat<T> to(const Mat<U> &real, const Mat<U> &imag)
428 {
429  it_assert_debug(real.rows() == imag.rows() && real.cols() == imag.cols(), "to: real and imag should have the same size");
430  Mat<T> y(real.rows(), real.cols());
431  for (int i = 0; i < real.rows(); i++) {
432  for (int j = 0; j < real.cols(); j++) {
433  y(i, j) = T(real(i, j), imag(i, j));
434  }
435  }
436  return y;
437 }
438 
440 template<class T, class U>
442 {
444  for (int i = 0; i < x.size(); i++) {
445  y(i) = to<T>(x(i));
446  }
447  return y;
448 }
449 
451 template<class T, class U>
453 {
454  it_assert_debug(real.size() == imag.size(), "to: real and imag should have the same size");
456  for (int i = 0; i < real.size(); i++) {
457  y(i) = to<T>(real(i), imag(i));
458  }
459  return y;
460 }
461 
463 inline double unfix(const Fix &x) {return x.unfix();}
465 inline std::complex<double> unfix(const CFix &x) {return x.unfix();}
467 inline vec unfix(const fixvec &x) {return to_vec(x);}
469 inline cvec unfix(const cfixvec &x) {return to_cvec(x);}
471 inline mat unfix(const fixmat &x) {return to_mat(x);}
473 inline cmat unfix(const cfixmat &x) {return to_cmat(x);}
474 
476 inline double unfix(double x) {return x;}
478 inline std::complex<double> unfix(const std::complex<double> &x) {return x;}
480 inline vec unfix(const vec &x) {return x;}
482 inline cvec unfix(const cvec &x) {return x;}
484 inline mat unfix(const mat &x) {return x;}
486 inline cmat unfix(const cmat &x) {return x;}
487 
489 
491 template<class T>
492 class Convert
493 {
494 public:
495  typedef double to_double;
496 };
498 template<>
499 class Convert<CFix>
500 {
501 public:
502  typedef std::complex<double> to_double;
503 };
505 template<class T>
506 class Convert<std::complex<T> >
507 {
508 public:
509  typedef std::complex<double> to_double;
510 };
512 template<class T>
513 class Convert<Array<T> >
514 {
515 public:
516  typedef Array<typename Convert<T>::to_double> to_double; // Recursive
517 };
519 template<class T>
520 class Convert<Vec<T> >
521 {
522 public:
523  typedef Vec<typename Convert<T>::to_double> to_double; // Recursive
524 };
526 template<class T>
527 class Convert<Mat<T> >
528 {
529 public:
530  typedef Mat<typename Convert<T>::to_double> to_double; // Recursive
531 };
532 
534 
536 template<class T>
538 {
540  for (int i = 0; i < x.size(); i++) {
541  y(i) = unfix(x(i));
542  }
543  return y;
544 }
545 
547 ITPP_EXPORT Fix abs(const Fix &x);
549 ITPP_EXPORT Fix real(const CFix &x);
551 ITPP_EXPORT Fix imag(const CFix &x);
553 ITPP_EXPORT CFix conj(const CFix &x);
554 
556 
557 } // namespace itpp
558 
559 #endif // #ifndef FIX_FUNCTIONS_H
SourceForge Logo

Generated on Sat Jul 6 2013 10:54:24 for IT++ by Doxygen 1.8.2