IT++ Logo
converters.cpp
Go to the documentation of this file.
1 
29 #include <itpp/base/converters.h>
30 #include <itpp/base/itcompat.h>
31 #include <itpp/base/matfunc.h>
32 #include <itpp/base/math/log_exp.h>
33 
35 
36 namespace itpp
37 {
38 
39 // ----------------------------------------------------------------------
40 // Vector converters
41 // ----------------------------------------------------------------------
42 
43 ivec to_ivec(int s) { ivec out(1); out(0) = s; return out; }
44 
45 vec to_vec(double s) { vec out(1); out(0) = s; return out; }
46 
47 cvec to_cvec(double real, double imag)
48 {
49  cvec out(1);
50  out(0) = std::complex<double>(real, imag);
51  return out;
52 }
53 
54 // ----------------------------------------------------------------------
55 // Miscellaneous converters
56 // ----------------------------------------------------------------------
57 
58 bvec dec2bin(int length, int index)
59 {
60  int i, bintemp = index;
61  bvec temp(length);
62 
63  for (i = length - 1; i >= 0; i--) {
64  temp(i) = bin(bintemp & 1);
65  bintemp = (bintemp >> 1);
66  }
67  return temp;
68 }
69 
70 bvec dec2bin(int index, bool msb_first)
71 {
72  int length = int2bits(index);
73  int i, bintemp = index;
74  bvec temp(length);
75 
76  for (i = length - 1; i >= 0; i--) {
77  temp(i) = bin(bintemp & 1);
78  bintemp = (bintemp >> 1);
79  }
80  if (msb_first) {
81  return temp;
82  }
83  else {
84  return reverse(temp);
85  }
86 }
87 
88 void dec2bin(int index, bvec &v)
89 {
90  int i, bintemp = index;
91  v.set_size(int2bits(index), false);
92 
93  for (i = v.size() - 1; i >= 0; i--) {
94  v(i) = bin(bintemp & 1);
95  bintemp = (bintemp >> 1);
96  }
97 }
98 
99 int bin2dec(const bvec &inbvec, bool msb_first)
100 {
101  int i, temp = 0;
102  int sizebvec = inbvec.length();
103  if (msb_first) {
104  for (i = 0; i < sizebvec; i++) {
105  temp += pow2i(sizebvec - i - 1) * int(inbvec(i));
106  }
107  }
108  else {
109  for (i = 0; i < sizebvec; i++) {
110  temp += pow2i(i) * int(inbvec(i));
111  }
112  }
113  return temp;
114 }
115 
116 bvec oct2bin(const ivec &octalindex, short keepzeros)
117 {
118  int length = octalindex.length(), i;
119  bvec out(3*length);
120  for (i = 0; i < length; i++) {
121  out.replace_mid(3*i, dec2bin(3, octalindex(i)));
122  }
123  //remove zeros if keepzeros = 0
124  if (keepzeros == 0) {
125  for (i = 0; i < out.length(); i++) {
126  if ((short)out(i) != 0) {
127  return out.right(out.length() - i);
128  break;
129  }
130  }
131  return bvec("0");
132  }
133  else {
134  return out;
135  }
136 }
137 
138 ivec bin2oct(const bvec &inbits)
139 {
140  int start, Itterations = ceil_i(inbits.length() / 3.0);
141  ivec out(Itterations);
142  for (int i = Itterations - 1; i > 0; i--) {
143  start = 3 * i - (3 * Itterations - inbits.length());
144  out(i) = bin2dec(inbits.mid(start, 3));
145  }
146  out(0) = bin2dec(inbits.left(inbits.length() - ((Itterations - 1) * 3)));
147  return out;
148 }
149 
150 ivec bin2pol(const bvec &inbvec)
151 {
152  return 1 -2*to_ivec(inbvec);
153 }
154 
155 bvec pol2bin(const ivec &inpol)
156 {
157  return to_bvec((1 -inpol) / 2);
158 }
159 
160 
161 // Round to nearest integer, return result in double
162 double round(double x) { return ::rint(x); }
163 // Round to nearest integer
164 vec round(const vec &x) { return apply_function<double>(::rint, x); }
165 // Round to nearest integer
166 mat round(const mat &x) { return apply_function<double>(::rint, x); }
167 // Round to nearest integer
168 int round_i(double x) { return static_cast<int>(::rint(x)); }
169 
170 // Round to nearest integer and return ivec
171 ivec round_i(const vec &x) { return to_ivec(round(x)); }
172 // Round to nearest integer and return imat
173 imat round_i(const mat &x) { return to_imat(round(x)); }
174 
175 // Round to nearest upper integer
176 ivec ceil_i(const vec &x) { return to_ivec(ceil(x)); }
177 // Round to nearest upper integer
178 imat ceil_i(const mat &x) { return to_imat(ceil(x)); }
179 
180 // Round to nearest lower integer
181 ivec floor_i(const vec &x) { return to_ivec(floor(x)); }
182 // Round to nearest lower integer
183 imat floor_i(const mat &x) { return to_imat(floor(x)); }
184 
185 
186 cvec round_to_zero(const cvec &x, double threshold)
187 {
188  cvec temp(x.length());
189 
190  for (int i = 0; i < x.length(); i++)
191  temp(i) = round_to_zero(x(i), threshold);
192 
193  return temp;
194 }
195 
196 cmat round_to_zero(const cmat &x, double threshold)
197 {
198  cmat temp(x.rows(), x.cols());
199 
200  for (int i = 0; i < x.rows(); i++) {
201  for (int j = 0; j < x.cols(); j++) {
202  temp(i, j) = round_to_zero(x(i, j), threshold);
203  }
204  }
205 
206  return temp;
207 }
208 
209 cvec round_to_infty(const cvec &in, const double threshold)
210 {
211  cvec temp(in.length());
212 
213  for (int i = 0; i < in.length(); i++)
214  temp(i) = round_to_infty(in(i), threshold);
215 
216  return temp;
217 }
218 
219 cmat round_to_infty(const cmat &in, const double threshold)
220 {
221  cmat temp(in.rows(), in.cols());
222 
223  for (int i = 0; i < in.rows(); i++) {
224  for (int j = 0; j < in.cols(); j++) {
225  temp(i, j) = round_to_infty(in(i, j), threshold);
226  }
227  }
228 
229  return temp;
230 }
231 
232 std::string to_str(const double &i, const int precision)
233 {
234  std::ostringstream ss;
235  ss.precision(precision);
236  ss.setf(std::ostringstream::scientific, std::ostringstream::floatfield);
237  ss << i;
238  return ss.str();
239 }
240 
241 // ----------------------------------------------------------------------
242 // Instantiations
243 // ----------------------------------------------------------------------
244 
245 template ITPP_EXPORT bvec to_bvec(const svec &v);
246 template ITPP_EXPORT bvec to_bvec(const ivec &v);
247 
248 template ITPP_EXPORT svec to_svec(const bvec &v);
249 template ITPP_EXPORT svec to_svec(const ivec &v);
250 template ITPP_EXPORT svec to_svec(const vec &v);
251 
252 template ITPP_EXPORT ivec to_ivec(const bvec &v);
253 template ITPP_EXPORT ivec to_ivec(const svec &v);
254 template ITPP_EXPORT ivec to_ivec(const vec &v);
255 
256 template ITPP_EXPORT vec to_vec(const bvec &v);
257 template ITPP_EXPORT vec to_vec(const svec &v);
258 template ITPP_EXPORT vec to_vec(const ivec &v);
259 
260 template ITPP_EXPORT cvec to_cvec(const bvec &v);
261 template ITPP_EXPORT cvec to_cvec(const svec &v);
262 template ITPP_EXPORT cvec to_cvec(const ivec &v);
263 template ITPP_EXPORT cvec to_cvec(const vec &v);
264 
265 template ITPP_EXPORT cvec to_cvec(const bvec &real, const bvec &imag);
266 template ITPP_EXPORT cvec to_cvec(const svec &real, const svec &imag);
267 template ITPP_EXPORT cvec to_cvec(const ivec &real, const ivec &imag);
268 template ITPP_EXPORT cvec to_cvec(const vec &real, const vec &imag);
269 
270 template ITPP_EXPORT bmat to_bmat(const smat &m);
271 template ITPP_EXPORT bmat to_bmat(const imat &m);
272 
273 template ITPP_EXPORT smat to_smat(const bmat &m);
274 template ITPP_EXPORT smat to_smat(const imat &m);
275 template ITPP_EXPORT smat to_smat(const mat &m);
276 
277 template ITPP_EXPORT imat to_imat(const bmat &m);
278 template ITPP_EXPORT imat to_imat(const smat &m);
279 template ITPP_EXPORT imat to_imat(const mat &m);
280 
281 template ITPP_EXPORT mat to_mat(const bmat &m);
282 template ITPP_EXPORT mat to_mat(const smat &m);
283 template ITPP_EXPORT mat to_mat(const imat &m);
284 
285 template ITPP_EXPORT cmat to_cmat(const bmat &m);
286 template ITPP_EXPORT cmat to_cmat(const smat &m);
287 template ITPP_EXPORT cmat to_cmat(const imat &m);
288 template ITPP_EXPORT cmat to_cmat(const mat &m);
289 
290 template ITPP_EXPORT cmat to_cmat(const bmat &real, const bmat &imag);
291 template ITPP_EXPORT cmat to_cmat(const smat &real, const smat &imag);
292 template ITPP_EXPORT cmat to_cmat(const imat &real, const imat &imag);
293 template ITPP_EXPORT cmat to_cmat(const mat &real, const mat &imag);
294 
295 } // namespace itpp
296 
SourceForge Logo

Generated on Sat May 25 2013 16:32:18 for IT++ by Doxygen 1.8.2