Mercurial > forge
view main/fixed/src/fixedCColVector.cc @ 9481:d84d2fea3c90 octave-forge
Re-enable compilation of fixed package
author | jordigh |
---|---|
date | Wed, 22 Feb 2012 22:07:33 +0000 |
parents | f8d77845533f |
children |
line wrap: on
line source
// Fixed Point Complex ColumnVector manipulations. /* Copyright (C) 2003 Motorola Inc Copyright (C) 2003 David Bateman This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; see the file COPYING. If not, see <http://www.gnu.org/licenses/>. In addition to the terms of the GPL, you are permitted to link this program with any Open Source program, as defined by the Open Source Initiative (www.opensource.org) */ #include <iostream> #include <octave/config.h> #include <octave/lo-utils.h> #include <octave/lo-error.h> #include <octave/error.h> #include <octave/gripes.h> #include <octave/ops.h> #include "fixedCMatrix.h" #include "fixedCRowVector.h" #include "fixedCColVector.h" // Fixed Point Complex Column Vector class FixedComplexColumnVector::FixedComplexColumnVector (const MArray<int> &is, const MArray<int> &ds) : MArray<FixedPointComplex> (dim_vector (is.length(), 1)) { if (length() != ds.length()) { (*current_liboctave_error_handler) ("vector size mismatch"); return; } for (int i = 0; i < length (); i++) elem (i) = FixedPointComplex((unsigned int)is(i), (unsigned int)ds(i)); } FixedComplexColumnVector::FixedComplexColumnVector (const ColumnVector &is, const ColumnVector &ds) : MArray<FixedPointComplex> (dim_vector (is.length(), 1)) { if (length() != ds.length()) { (*current_liboctave_error_handler) ("vector size mismatch"); return; } for (int i = 0; i < length (); i++) elem (i) = FixedPointComplex((unsigned int)is(i), (unsigned int)ds(i)); } FixedComplexColumnVector::FixedComplexColumnVector (const ComplexColumnVector &is, const ComplexColumnVector &ds) : MArray<FixedPointComplex> (dim_vector (is.length(), 1)) { if (length() != ds.length()) { (*current_liboctave_error_handler) ("vector size mismatch"); return; } for (int i = 0; i < length (); i++) elem (i) = FixedPointComplex(is(i), ds(i)); } FixedComplexColumnVector::FixedComplexColumnVector (unsigned int is, unsigned int ds, const FixedComplexColumnVector& a) : MArray<FixedPointComplex> (dim_vector (a.length(), 1)) { for (int i = 0; i < length (); i++) elem (i) = FixedPointComplex(is, ds, a(i)); } FixedComplexColumnVector::FixedComplexColumnVector (Complex is, Complex ds, const FixedComplexColumnVector& a) : MArray<FixedPointComplex> (dim_vector (a.length(), 1)) { for (int i = 0; i < length (); i++) elem (i) = FixedPointComplex(is, ds, a(i)); } FixedComplexColumnVector::FixedComplexColumnVector (const MArray<int> &is, const MArray<int> &ds, const FixedComplexColumnVector& a) : MArray<FixedPointComplex> (dim_vector (is.length(), 1)) { if ((length() != ds.length()) || (length() != a.length())) { (*current_liboctave_error_handler) ("vector size mismatch"); return; } for (int i = 0; i < length (); i++) elem (i) = FixedPointComplex((unsigned int)is(i), (unsigned int)ds(i), a(i)); } FixedComplexColumnVector::FixedComplexColumnVector (const ColumnVector &is, const ColumnVector &ds, const FixedComplexColumnVector& a) : MArray<FixedPointComplex> (dim_vector (is.length(), 1)) { if ((length() != ds.length()) || (length() != a.length())) { (*current_liboctave_error_handler) ("vector size mismatch"); return; } for (int i = 0; i < length (); i++) elem (i) = FixedPointComplex((unsigned int)is(i), (unsigned int)ds(i), a(i)); } FixedComplexColumnVector::FixedComplexColumnVector (const ComplexColumnVector &is, const ComplexColumnVector &ds, const FixedComplexColumnVector& a) : MArray<FixedPointComplex> (dim_vector (is.length(), 1)) { if ((length() != ds.length()) || (length() != a.length())) { (*current_liboctave_error_handler) ("vector size mismatch"); return; } for (int i = 0; i < length (); i++) elem (i) = FixedPointComplex(is(i), ds(i), a(i)); } FixedComplexColumnVector::FixedComplexColumnVector (unsigned int is, unsigned int ds, const FixedColumnVector& a) : MArray<FixedPointComplex> (dim_vector (a.length(), 1)) { for (int i = 0; i < length (); i++) elem (i) = FixedPointComplex(is, ds, a(i)); } FixedComplexColumnVector::FixedComplexColumnVector (Complex is, Complex ds, const FixedColumnVector& a) : MArray<FixedPointComplex> (dim_vector (a.length(), 1)) { for (int i = 0; i < length (); i++) elem (i) = FixedPointComplex(is, ds, FixedPointComplex(a(i))); } FixedComplexColumnVector::FixedComplexColumnVector (const MArray<int> &is, const MArray<int> &ds, const FixedColumnVector& a) : MArray<FixedPointComplex> (dim_vector (is.length(), 1)) { if ((length() != ds.length()) || (length() != a.length())) { (*current_liboctave_error_handler) ("vector size mismatch"); return; } for (int i = 0; i < length (); i++) elem (i) = FixedPointComplex((unsigned int)is(i), (unsigned int)ds(i), a(i)); } FixedComplexColumnVector::FixedComplexColumnVector (const ColumnVector &is, const ColumnVector &ds, const FixedColumnVector& a) : MArray<FixedPointComplex> (dim_vector (is.length(), 1)) { if ((length() != ds.length()) || (length() != a.length())) { (*current_liboctave_error_handler) ("vector size mismatch"); return; } for (int i = 0; i < length (); i++) elem (i) = FixedPointComplex((unsigned int)is(i), (unsigned int)ds(i), a(i)); } FixedComplexColumnVector::FixedComplexColumnVector (const ComplexColumnVector &is, const ComplexColumnVector &ds, const FixedColumnVector& a) : MArray<FixedPointComplex> (dim_vector (is.length(), 1)) { if ((length() != ds.length()) || (length() != a.length())) { (*current_liboctave_error_handler) ("vector size mismatch"); return; } for (int i = 0; i < length (); i++) elem (i) = FixedPointComplex(is(i), ds(i), FixedPointComplex(a(i))); } FixedComplexColumnVector::FixedComplexColumnVector (unsigned int is, unsigned int ds, const ComplexColumnVector& a) : MArray<FixedPointComplex> (dim_vector (a.length(), 1)) { for (int i = 0; i < length (); i++) elem (i) = FixedPointComplex(is, ds, a(i)); } FixedComplexColumnVector::FixedComplexColumnVector (Complex is, Complex ds, const ComplexColumnVector& a) : MArray<FixedPointComplex> (dim_vector (a.length(), 1)) { for (int i = 0; i < length (); i++) elem (i) = FixedPointComplex(is, ds, a(i)); } FixedComplexColumnVector::FixedComplexColumnVector (const MArray<int> &is, const MArray<int> &ds, const ComplexColumnVector& a) : MArray<FixedPointComplex> (dim_vector (is.length(), 1)) { if ((length() != ds.length()) || (length() != a.length())) { (*current_liboctave_error_handler) ("vector size mismatch"); return; } for (int i = 0; i < length (); i++) elem (i) = FixedPointComplex((unsigned int)is(i), (unsigned int)ds(i), a(i)); } FixedComplexColumnVector::FixedComplexColumnVector (const ColumnVector &is, const ColumnVector &ds, const ComplexColumnVector& a) : MArray<FixedPointComplex> (dim_vector (is.length(), 1)) { if ((length() != ds.length()) || (length() != a.length())) { (*current_liboctave_error_handler) ("vector size mismatch"); return; } for (int i = 0; i < length (); i++) elem (i) = FixedPointComplex((unsigned int)is(i), (unsigned int)ds(i), a(i)); } FixedComplexColumnVector::FixedComplexColumnVector (const ComplexColumnVector &is, const ComplexColumnVector &ds, const ComplexColumnVector& a) : MArray<FixedPointComplex> (dim_vector (is.length(), 1)) { if ((length() != ds.length()) || (length() != a.length())) { (*current_liboctave_error_handler) ("vector size mismatch"); return; } for (int i = 0; i < length (); i++) elem (i) = FixedPointComplex(is(i), ds(i), a(i)); } FixedComplexColumnVector::FixedComplexColumnVector (unsigned int is, unsigned int ds, const ColumnVector& a) : MArray<FixedPointComplex> (dim_vector (a.length(), 1)) { for (int i = 0; i < length (); i++) elem (i) = FixedPointComplex(is, ds, a(i)); } FixedComplexColumnVector::FixedComplexColumnVector (Complex is, Complex ds, const ColumnVector& a) : MArray<FixedPointComplex> (dim_vector (a.length(), 1)) { for (int i = 0; i < length (); i++) elem (i) = FixedPointComplex(is, ds, a(i)); } FixedComplexColumnVector::FixedComplexColumnVector (const MArray<int> &is, const MArray<int> &ds, const ColumnVector& a) : MArray<FixedPointComplex> (dim_vector (is.length(), 1)) { if ((length() != ds.length()) || (length() != a.length())) { (*current_liboctave_error_handler) ("vector size mismatch"); return; } for (int i = 0; i < length (); i++) elem (i) = FixedPointComplex((unsigned int)is(i), (unsigned int)ds(i), a(i)); } FixedComplexColumnVector::FixedComplexColumnVector (const ColumnVector &is, const ColumnVector &ds, const ColumnVector& a) : MArray<FixedPointComplex> (dim_vector (is.length(), 1)) { if ((length() != ds.length()) || (length() != a.length())) { (*current_liboctave_error_handler) ("vector size mismatch"); return; } for (int i = 0; i < length (); i++) elem (i) = FixedPointComplex((unsigned int)is(i), (unsigned int)ds(i), a(i)); } FixedComplexColumnVector::FixedComplexColumnVector (const ComplexColumnVector &is, const ComplexColumnVector &ds, const ColumnVector& a) : MArray<FixedPointComplex> (dim_vector (is.length(), 1)) { if ((length() != ds.length()) || (length() != a.length())) { (*current_liboctave_error_handler) ("vector size mismatch"); return; } for (int i = 0; i < length (); i++) elem (i) = FixedPointComplex(is(i), ds(i), a(i)); } FixedComplexColumnVector::FixedComplexColumnVector (unsigned int is, unsigned int ds, const ComplexColumnVector& a, const ComplexColumnVector& b) : MArray<FixedPointComplex> (dim_vector (a.length(), 1)) { if (length() != b.length()) { (*current_liboctave_error_handler) ("vector size mismatch"); return; } for (int i = 0; i < length (); i++) elem (i) = FixedPointComplex(is, ds, a(i), b(i)); } FixedComplexColumnVector::FixedComplexColumnVector (Complex is, Complex ds, const ComplexColumnVector& a, const ComplexColumnVector& b) : MArray<FixedPointComplex> (dim_vector (a.length(), 1)) { if (length() != b.length()) { (*current_liboctave_error_handler) ("vector size mismatch"); return; } for (int i = 0; i < length (); i++) elem (i) = FixedPointComplex(is, ds, a(i), b(i)); } FixedComplexColumnVector::FixedComplexColumnVector (const MArray<int> &is, const MArray<int> &ds, const ComplexColumnVector& a, const ComplexColumnVector& b) : MArray<FixedPointComplex> (dim_vector (is.length(), 1)) { if ((length() != ds.length()) || (length() != a.length()) || (length() != b.length())) { (*current_liboctave_error_handler) ("vector size mismatch"); return; } for (int i = 0; i < length (); i++) elem (i) = FixedPointComplex((unsigned int)is(i), (unsigned int)ds(i), a(i), b(i)); } FixedComplexColumnVector::FixedComplexColumnVector (const ColumnVector &is, const ColumnVector &ds, const ComplexColumnVector& a, const ComplexColumnVector& b) : MArray<FixedPointComplex> (dim_vector (is.length(), 1)) { if ((length() != ds.length()) || (length() != a.length()) || (length() != b.length())) { (*current_liboctave_error_handler) ("vector size mismatch"); return; } for (int i = 0; i < length (); i++) elem (i) = FixedPointComplex((unsigned int)is(i), (unsigned int)ds(i), a(i), b(i)); } FixedComplexColumnVector::FixedComplexColumnVector (const ComplexColumnVector &is, const ComplexColumnVector &ds, const ComplexColumnVector& a, const ComplexColumnVector& b) : MArray<FixedPointComplex> (dim_vector (is.length(), 1)) { if ((length() != ds.length()) || (length() != a.length()) || (length() != b.length())) { (*current_liboctave_error_handler) ("vector size mismatch"); return; } for (int i = 0; i < length (); i++) elem (i) = FixedPointComplex(is(i), ds(i), a(i), b(i)); } #define GET_FIXED_PROP(METHOD) \ ComplexColumnVector \ FixedComplexColumnVector:: METHOD (void) const \ { \ int len = length(); \ ComplexColumnVector retval(len); \ for (int i = 0; i < len; i++) \ retval(i) = elem(i) . METHOD (); \ return retval; \ } \ GET_FIXED_PROP(sign); GET_FIXED_PROP(getdecsize); GET_FIXED_PROP(getintsize); GET_FIXED_PROP(getnumber); GET_FIXED_PROP(fixedpoint); #undef GET_FIXED_PROP FixedComplexColumnVector FixedComplexColumnVector::chdecsize (const Complex n) { int len = length(); FixedComplexColumnVector retval(len); for (int i = 0; i < len; i++) retval(i) = FixedPointComplex(elem(i).getintsize(), n, elem(i)); return retval; } FixedComplexColumnVector FixedComplexColumnVector::chdecsize (const ComplexColumnVector &n) { int len = length(); if (len != n.length()) { (*current_liboctave_error_handler) ("vector size mismatch in chdecsize"); return FixedComplexColumnVector(); } FixedComplexColumnVector retval(len); for (int i = 0; i < len; i++) retval(i) = FixedPointComplex(elem(i).getintsize(), n(i), elem(i)); return retval; } FixedComplexColumnVector FixedComplexColumnVector::chintsize (const Complex n) { int len = length(); FixedComplexColumnVector retval(len); for (int i = 0; i < len; i++) retval(i) = FixedPointComplex(n, elem(i).getdecsize(), elem(i)); return retval; } FixedComplexColumnVector FixedComplexColumnVector::chintsize (const ComplexColumnVector &n) { int len = length(); if (len != n.length()) { (*current_liboctave_error_handler) ("vector size mismatch in chdecsize"); return FixedComplexColumnVector(); } FixedComplexColumnVector retval(len); for (int i = 0; i < len; i++) retval(i) = FixedPointComplex(n(i), elem(i).getdecsize(), elem(i)); return retval; } FixedComplexColumnVector FixedComplexColumnVector::incdecsize (const Complex n) { return chdecsize(n + getdecsize()); } FixedComplexColumnVector FixedComplexColumnVector::incdecsize (const ComplexColumnVector &n) { if (n.length() != length()) { (*current_liboctave_error_handler) ("vector size mismatch in incdecsize"); return FixedComplexColumnVector(); } return chdecsize(n + getdecsize()); } FixedComplexColumnVector FixedComplexColumnVector::incdecsize () { return chdecsize(Complex (1) + getdecsize()); } FixedComplexColumnVector FixedComplexColumnVector::incintsize (const Complex n) { return chintsize(n + getintsize()); } FixedComplexColumnVector FixedComplexColumnVector::incintsize (const ComplexColumnVector &n) { if (n.length() != length()) { (*current_liboctave_error_handler) ("vector size mismatch in incintsize"); return FixedComplexColumnVector(); } return chintsize(n + getintsize()); } FixedComplexColumnVector FixedComplexColumnVector::incintsize () { return chintsize(Complex (1) + getintsize()); } // Fixed Point Complex Column Vector class. bool FixedComplexColumnVector::operator == (const FixedComplexColumnVector& a) const { int len = length (); if (len != a.length ()) return 0; for (int i = 0; i < len; i++) if (elem(i) != a.elem(i)) return false; return true; } bool FixedComplexColumnVector::operator != (const FixedComplexColumnVector& a) const { return !(*this == a); } FixedComplexColumnVector& FixedComplexColumnVector::insert (const FixedComplexColumnVector& a, int r) { int a_len = a.length (); if (r < 0 || r + a_len > length ()) { (*current_liboctave_error_handler) ("range error for insert"); return *this; } if (a_len > 0) { make_unique (); for (int i = 0; i < a_len; i++) xelem (r+i) = a.elem (i); } return *this; } FixedComplexColumnVector& FixedComplexColumnVector::fill (FixedPointComplex val) { int len = length (); if (len > 0) { make_unique (); for (int i = 0; i < len; i++) xelem (i) = val; } return *this; } FixedComplexColumnVector& FixedComplexColumnVector::fill (FixedPointComplex val, int r1, int r2) { int len = length (); if (r1 < 0 || r2 < 0 || r1 >= len || r2 >= len) { (*current_liboctave_error_handler) ("range error for fill"); return *this; } if (r1 > r2) { int tmp = r1; r1 = r2; r2 = tmp; } if (r2 >= r1) { make_unique (); for (int i = r1; i <= r2; i++) xelem (i) = val; } return *this; } FixedComplexColumnVector FixedComplexColumnVector::stack (const FixedComplexColumnVector& a) const { int len = length (); int nr_insert = len; FixedComplexColumnVector retval (len + a.length ()); retval.insert (*this, 0); retval.insert (a, nr_insert); return retval; } FixedComplexRowVector FixedComplexColumnVector::transpose (void) const { return FixedComplexRowVector (*this); } // resize is the destructive equivalent for this one FixedComplexColumnVector FixedComplexColumnVector::extract (int r1, int r2) const { if (r1 > r2) { int tmp = r1; r1 = r2; r2 = tmp; } int new_r = r2 - r1 + 1; FixedComplexColumnVector result (new_r); for (int i = 0; i < new_r; i++) result.xelem (i) = elem (r1+i); return result; } FixedComplexColumnVector FixedComplexColumnVector::extract_n (int r1, int n) const { FixedComplexColumnVector result (n); for (int i = 0; i < n; i++) result.xelem (i) = elem (r1+i); return result; } // fixed point matrix by fixed column vector -> fixed column vector operations FixedComplexColumnVector operator * (const FixedComplexMatrix& m, const FixedComplexColumnVector& a) { FixedComplexColumnVector retval; int nr = m.rows (); int nc = m.cols (); int a_len = a.length (); if (nc != a_len) gripe_nonconformant ("operator *", nr, nc, a_len, 1); else { retval.resize (nr, FixedPointComplex()); if (nr != 0 && nc != 0) for (int i = 0; i < nc; i++) for (int j = 0; j < nr; j++) retval.elem (j) += a.elem(i) * m.elem(j,i); } return retval; } // other operations FixedComplexColumnVector FixedComplexColumnVector::map (fpc_fpc_Mapper f) const { FixedComplexColumnVector b (*this); return b.apply (f); } FixedComplexColumnVector& FixedComplexColumnVector::apply (fpc_fpc_Mapper f) { FixedPointComplex *d = fortran_vec (); // Ensures only one reference to my privates! for (int i = 0; i < length (); i++) d[i] = f (d[i]); return *this; } FixedPointComplex FixedComplexColumnVector::min (void) const { int len = length (); if (len == 0) return FixedPointComplex(); FixedPointComplex res = elem (0); double res_val = std::abs(res.fixedpoint ()); for (int i = 1; i < len; i++) if (std::abs(elem (i) .fixedpoint ()) < res_val) { res = elem (i); res_val = std::abs(res.fixedpoint ()); } return res; } FixedPointComplex FixedComplexColumnVector::max (void) const { int len = length (); if (len == 0) return FixedPointComplex(); FixedPointComplex res = elem (0); double res_val = std::abs(res.fixedpoint ()); for (int i = 1; i < len; i++) if (std::abs(elem (i) .fixedpoint ()) > res_val) { res = elem (i); res_val = std::abs(res.fixedpoint ()); } return res; } #define DO_FIXED_VEC_FUNC(FUNC, MT) \ MT FUNC (const FixedComplexColumnVector& x) \ { \ MT retval (x.length()); \ for (int i = 0; i < x.length(); i++) \ retval(i) = FUNC ( x (i) ); \ return retval; \ } DO_FIXED_VEC_FUNC(real, FixedColumnVector); DO_FIXED_VEC_FUNC(imag, FixedColumnVector); DO_FIXED_VEC_FUNC(conj, FixedComplexColumnVector); DO_FIXED_VEC_FUNC(abs, FixedColumnVector); DO_FIXED_VEC_FUNC(norm, FixedColumnVector); DO_FIXED_VEC_FUNC(arg, FixedColumnVector); DO_FIXED_VEC_FUNC(cos, FixedComplexColumnVector); DO_FIXED_VEC_FUNC(cosh, FixedComplexColumnVector); DO_FIXED_VEC_FUNC(sin, FixedComplexColumnVector); DO_FIXED_VEC_FUNC(sinh, FixedComplexColumnVector); DO_FIXED_VEC_FUNC(tan, FixedComplexColumnVector); DO_FIXED_VEC_FUNC(tanh, FixedComplexColumnVector); DO_FIXED_VEC_FUNC(sqrt, FixedComplexColumnVector); DO_FIXED_VEC_FUNC(exp, FixedComplexColumnVector); DO_FIXED_VEC_FUNC(log, FixedComplexColumnVector); DO_FIXED_VEC_FUNC(log10, FixedComplexColumnVector); DO_FIXED_VEC_FUNC(round, FixedComplexColumnVector); DO_FIXED_VEC_FUNC(rint, FixedComplexColumnVector); DO_FIXED_VEC_FUNC(floor, FixedComplexColumnVector); DO_FIXED_VEC_FUNC(ceil, FixedComplexColumnVector); FixedComplexColumnVector polar (const FixedColumnVector &r, const FixedColumnVector &p) { if (r.length() != p.length()) { (*current_liboctave_error_handler) ("vector size mismatch"); return FixedComplexColumnVector(); } FixedComplexColumnVector retval ( r.length()); for (int i = 0; i < r.length(); i++) retval(i) = polar ( r (i), p (i) ); return retval; } FixedComplexColumnVector elem_pow (const FixedComplexColumnVector &a, const FixedComplexColumnVector &b) { FixedComplexColumnVector retval; int a_len = a.length (); int b_len = b.length (); if (a_len == 1) { retval.resize(b_len); FixedPointComplex ad = a(0); for (int i = 0; i < b_len; i++) retval(i) = pow(ad, b(i)); } else if (b_len == 1) { retval.resize(a_len); FixedPointComplex bd = b(0); for (int i = 0; i < a_len; i++) retval(i) = pow(a(i), bd); } else if (a_len == b_len) { retval.resize(a_len); for (int i = 0; i < a_len; i++) retval(i) = pow(a(i), b(i)); } else gripe_nonconformant ("operator .^", a_len, b_len); return retval; } FixedComplexColumnVector elem_pow (const FixedComplexColumnVector &a, const FixedPointComplex &b) { return elem_pow (a, FixedComplexColumnVector(1, b)); } FixedComplexColumnVector elem_pow (const FixedPointComplex &a, const FixedComplexColumnVector &b) { return elem_pow (FixedComplexColumnVector(1, a), b); } std::ostream& operator << (std::ostream& os, const FixedComplexColumnVector& a) { for (int i = 0; i < a.length (); i++) os << a.elem (i) << "\n"; return os; } std::istream& operator >> (std::istream& is, FixedComplexColumnVector& a) { int len = a.length(); if (len < 1) is.clear (std::ios::badbit); else { FixedPointComplex tmp; for (int i = 0; i < len; i++) { is >> tmp; if (is) a.elem (i) = tmp; else break; } } return is; } /* ;;; Local Variables: *** ;;; mode: C++ *** ;;; End: *** */