annotate armadillo-3.900.4/include/armadillo_bits/fn_conv_to.hpp @ 84:55a047986812 tip

Update library URI so as not to be document-local
author Chris Cannam
date Wed, 22 Apr 2020 14:21:57 +0100
parents 1ec0e2823891
children
rev   line source
Chris@49 1 // Copyright (C) 2008-2012 NICTA (www.nicta.com.au)
Chris@49 2 // Copyright (C) 2008-2012 Conrad Sanderson
Chris@49 3 //
Chris@49 4 // This Source Code Form is subject to the terms of the Mozilla Public
Chris@49 5 // License, v. 2.0. If a copy of the MPL was not distributed with this
Chris@49 6 // file, You can obtain one at http://mozilla.org/MPL/2.0/.
Chris@49 7
Chris@49 8
Chris@49 9 //! \addtogroup fn_conv_to
Chris@49 10 //! @{
Chris@49 11
Chris@49 12
Chris@49 13
Chris@49 14 //! conversion from Armadillo Base and BaseCube objects to scalars
Chris@49 15 //! (kept only for compatibility with old code; use as_scalar() instead for Base objects like Mat)
Chris@49 16 template<typename out_eT>
Chris@49 17 class conv_to
Chris@49 18 {
Chris@49 19 public:
Chris@49 20
Chris@49 21 template<typename in_eT, typename T1>
Chris@49 22 inline static out_eT from(const Base<in_eT, T1>& in, const typename arma_not_cx<in_eT>::result* junk = 0);
Chris@49 23
Chris@49 24 template<typename in_eT, typename T1>
Chris@49 25 inline static out_eT from(const Base<in_eT, T1>& in, const typename arma_cx_only<in_eT>::result* junk = 0);
Chris@49 26
Chris@49 27 template<typename in_eT, typename T1>
Chris@49 28 inline static out_eT from(const BaseCube<in_eT, T1>& in, const typename arma_not_cx<in_eT>::result* junk = 0);
Chris@49 29
Chris@49 30 template<typename in_eT, typename T1>
Chris@49 31 inline static out_eT from(const BaseCube<in_eT, T1>& in, const typename arma_cx_only<in_eT>::result* junk = 0);
Chris@49 32 };
Chris@49 33
Chris@49 34
Chris@49 35
Chris@49 36 template<typename out_eT>
Chris@49 37 template<typename in_eT, typename T1>
Chris@49 38 inline
Chris@49 39 out_eT
Chris@49 40 conv_to<out_eT>::from(const Base<in_eT, T1>& in, const typename arma_not_cx<in_eT>::result* junk)
Chris@49 41 {
Chris@49 42 arma_extra_debug_sigprint();
Chris@49 43 arma_ignore(junk);
Chris@49 44
Chris@49 45 arma_type_check(( is_supported_elem_type<out_eT>::value == false ));
Chris@49 46
Chris@49 47 const unwrap<T1> tmp(in.get_ref());
Chris@49 48 const Mat<in_eT>& X = tmp.M;
Chris@49 49
Chris@49 50 arma_debug_check( (X.n_elem != 1), "conv_to(): given object doesn't have exactly one element" );
Chris@49 51
Chris@49 52 return out_eT(X.mem[0]);
Chris@49 53 }
Chris@49 54
Chris@49 55
Chris@49 56
Chris@49 57 template<typename out_eT>
Chris@49 58 template<typename in_eT, typename T1>
Chris@49 59 inline
Chris@49 60 out_eT
Chris@49 61 conv_to<out_eT>::from(const Base<in_eT, T1>& in, const typename arma_cx_only<in_eT>::result* junk)
Chris@49 62 {
Chris@49 63 arma_extra_debug_sigprint();
Chris@49 64 arma_ignore(junk);
Chris@49 65
Chris@49 66 arma_type_check(( is_supported_elem_type<out_eT>::value == false ));
Chris@49 67
Chris@49 68 const unwrap<T1> tmp(in.get_ref());
Chris@49 69 const Mat<in_eT>& X = tmp.M;
Chris@49 70
Chris@49 71 arma_debug_check( (X.n_elem != 1), "conv_to(): given object doesn't have exactly one element" );
Chris@49 72
Chris@49 73 out_eT out;
Chris@49 74
Chris@49 75 arrayops::convert_cx_scalar(out, X.mem[0]);
Chris@49 76
Chris@49 77 return out;
Chris@49 78 }
Chris@49 79
Chris@49 80
Chris@49 81
Chris@49 82 template<typename out_eT>
Chris@49 83 template<typename in_eT, typename T1>
Chris@49 84 inline
Chris@49 85 out_eT
Chris@49 86 conv_to<out_eT>::from(const BaseCube<in_eT, T1>& in, const typename arma_not_cx<in_eT>::result* junk)
Chris@49 87 {
Chris@49 88 arma_extra_debug_sigprint();
Chris@49 89 arma_ignore(junk);
Chris@49 90
Chris@49 91 arma_type_check(( is_supported_elem_type<out_eT>::value == false ));
Chris@49 92
Chris@49 93 const unwrap_cube<T1> tmp(in.get_ref());
Chris@49 94 const Cube<in_eT>& X = tmp.M;
Chris@49 95
Chris@49 96 arma_debug_check( (X.n_elem != 1), "conv_to(): given object doesn't have exactly one element" );
Chris@49 97
Chris@49 98 return out_eT(X.mem[0]);
Chris@49 99 }
Chris@49 100
Chris@49 101
Chris@49 102
Chris@49 103 template<typename out_eT>
Chris@49 104 template<typename in_eT, typename T1>
Chris@49 105 inline
Chris@49 106 out_eT
Chris@49 107 conv_to<out_eT>::from(const BaseCube<in_eT, T1>& in, const typename arma_cx_only<in_eT>::result* junk)
Chris@49 108 {
Chris@49 109 arma_extra_debug_sigprint();
Chris@49 110 arma_ignore(junk);
Chris@49 111
Chris@49 112 arma_type_check(( is_supported_elem_type<out_eT>::value == false ));
Chris@49 113
Chris@49 114 const unwrap_cube<T1> tmp(in.get_ref());
Chris@49 115 const Cube<in_eT>& X = tmp.M;
Chris@49 116
Chris@49 117 arma_debug_check( (X.n_elem != 1), "conv_to(): given object doesn't have exactly one element" );
Chris@49 118
Chris@49 119 out_eT out;
Chris@49 120
Chris@49 121 arrayops::convert_cx_scalar(out, X.mem[0]);
Chris@49 122
Chris@49 123 return out;
Chris@49 124 }
Chris@49 125
Chris@49 126
Chris@49 127
Chris@49 128 //! conversion to Armadillo matrices from Armadillo Base objects, as well as from std::vector
Chris@49 129 template<typename out_eT>
Chris@49 130 class conv_to< Mat<out_eT> >
Chris@49 131 {
Chris@49 132 public:
Chris@49 133
Chris@49 134 template<typename in_eT, typename T1>
Chris@49 135 inline static Mat<out_eT> from(const Base<in_eT, T1>& in, const typename arma_not_cx<in_eT>::result* junk = 0);
Chris@49 136
Chris@49 137 template<typename in_eT, typename T1>
Chris@49 138 inline static Mat<out_eT> from(const Base<in_eT, T1>& in, const typename arma_cx_only<in_eT>::result* junk = 0);
Chris@49 139
Chris@49 140
Chris@49 141
Chris@49 142 template<typename in_eT>
Chris@49 143 inline static Mat<out_eT> from(const std::vector<in_eT>& in, const typename arma_not_cx<in_eT>::result* junk = 0);
Chris@49 144
Chris@49 145 template<typename in_eT>
Chris@49 146 inline static Mat<out_eT> from(const std::vector<in_eT>& in, const typename arma_cx_only<in_eT>::result* junk = 0);
Chris@49 147 };
Chris@49 148
Chris@49 149
Chris@49 150
Chris@49 151 template<typename out_eT>
Chris@49 152 template<typename in_eT, typename T1>
Chris@49 153 inline
Chris@49 154 Mat<out_eT>
Chris@49 155 conv_to< Mat<out_eT> >::from(const Base<in_eT, T1>& in, const typename arma_not_cx<in_eT>::result* junk)
Chris@49 156 {
Chris@49 157 arma_extra_debug_sigprint();
Chris@49 158 arma_ignore(junk);
Chris@49 159
Chris@49 160 const unwrap<T1> tmp(in.get_ref());
Chris@49 161 const Mat<in_eT>& X = tmp.M;
Chris@49 162
Chris@49 163 Mat<out_eT> out(X.n_rows, X.n_cols);
Chris@49 164
Chris@49 165 arrayops::convert( out.memptr(), X.memptr(), out.n_elem );
Chris@49 166
Chris@49 167 return out;
Chris@49 168 }
Chris@49 169
Chris@49 170
Chris@49 171
Chris@49 172 template<typename out_eT>
Chris@49 173 template<typename in_eT, typename T1>
Chris@49 174 inline
Chris@49 175 Mat<out_eT>
Chris@49 176 conv_to< Mat<out_eT> >::from(const Base<in_eT, T1>& in, const typename arma_cx_only<in_eT>::result* junk)
Chris@49 177 {
Chris@49 178 arma_extra_debug_sigprint();
Chris@49 179 arma_ignore(junk);
Chris@49 180
Chris@49 181 const unwrap<T1> tmp(in.get_ref());
Chris@49 182 const Mat<in_eT>& X = tmp.M;
Chris@49 183
Chris@49 184 Mat<out_eT> out(X.n_rows, X.n_cols);
Chris@49 185
Chris@49 186 arrayops::convert_cx( out.memptr(), X.memptr(), out.n_elem );
Chris@49 187
Chris@49 188 return out;
Chris@49 189 }
Chris@49 190
Chris@49 191
Chris@49 192
Chris@49 193 template<typename out_eT>
Chris@49 194 template<typename in_eT>
Chris@49 195 inline
Chris@49 196 Mat<out_eT>
Chris@49 197 conv_to< Mat<out_eT> >::from(const std::vector<in_eT>& in, const typename arma_not_cx<in_eT>::result* junk)
Chris@49 198 {
Chris@49 199 arma_extra_debug_sigprint();
Chris@49 200 arma_ignore(junk);
Chris@49 201
Chris@49 202 const uword N = uword( in.size() );
Chris@49 203
Chris@49 204 Mat<out_eT> out(N, 1);
Chris@49 205
Chris@49 206 if(N > 0)
Chris@49 207 {
Chris@49 208 out_eT* out_mem = out.memptr();
Chris@49 209 const in_eT* in_mem = &(in[0]);
Chris@49 210
Chris@49 211 for(uword i=0; i<N; ++i)
Chris@49 212 {
Chris@49 213 out_mem[i] = out_eT( in_mem[i] );
Chris@49 214 }
Chris@49 215 }
Chris@49 216
Chris@49 217 return out;
Chris@49 218 }
Chris@49 219
Chris@49 220
Chris@49 221
Chris@49 222 template<typename out_eT>
Chris@49 223 template<typename in_eT>
Chris@49 224 inline
Chris@49 225 Mat<out_eT>
Chris@49 226 conv_to< Mat<out_eT> >::from(const std::vector<in_eT>& in, const typename arma_cx_only<in_eT>::result* junk)
Chris@49 227 {
Chris@49 228 arma_extra_debug_sigprint();
Chris@49 229 arma_ignore(junk);
Chris@49 230
Chris@49 231 Mat<out_eT> out(in.size(), 1);
Chris@49 232
Chris@49 233 typename std::vector<in_eT>::const_iterator in_begin = in.begin();
Chris@49 234 typename std::vector<in_eT>::const_iterator in_end = in.end();
Chris@49 235
Chris@49 236 typename Mat<out_eT>::iterator out_begin = out.begin();
Chris@49 237 typename Mat<out_eT>::iterator out_end = out.end();
Chris@49 238
Chris@49 239 typename std::vector<in_eT>::const_iterator in_it;
Chris@49 240 typename Mat<out_eT>::iterator out_it;
Chris@49 241
Chris@49 242 for(in_it = in_begin, out_it = out_begin; (in_it != in_end) && (out_it != out_end); ++in_it, ++out_it)
Chris@49 243 {
Chris@49 244 out_eT& out_elem = (*out_it);
Chris@49 245 const in_eT& in_elem = (*in_it);
Chris@49 246
Chris@49 247 arrayops::convert_cx_scalar(out_elem, in_elem);
Chris@49 248 }
Chris@49 249
Chris@49 250 return out;
Chris@49 251 }
Chris@49 252
Chris@49 253
Chris@49 254
Chris@49 255 //! conversion to Armadillo row vectors from Armadillo Base objects, as well as from std::vector
Chris@49 256 template<typename out_eT>
Chris@49 257 class conv_to< Row<out_eT> >
Chris@49 258 {
Chris@49 259 public:
Chris@49 260
Chris@49 261 template<typename in_eT, typename T1>
Chris@49 262 inline static Row<out_eT> from(const Base<in_eT, T1>& in, const typename arma_not_cx<in_eT>::result* junk = 0);
Chris@49 263
Chris@49 264 template<typename in_eT, typename T1>
Chris@49 265 inline static Row<out_eT> from(const Base<in_eT, T1>& in, const typename arma_cx_only<in_eT>::result* junk = 0);
Chris@49 266
Chris@49 267
Chris@49 268
Chris@49 269 template<typename in_eT>
Chris@49 270 inline static Row<out_eT> from(const std::vector<in_eT>& in, const typename arma_not_cx<in_eT>::result* junk = 0);
Chris@49 271
Chris@49 272 template<typename in_eT>
Chris@49 273 inline static Row<out_eT> from(const std::vector<in_eT>& in, const typename arma_cx_only<in_eT>::result* junk = 0);
Chris@49 274 };
Chris@49 275
Chris@49 276
Chris@49 277
Chris@49 278 template<typename out_eT>
Chris@49 279 template<typename in_eT, typename T1>
Chris@49 280 inline
Chris@49 281 Row<out_eT>
Chris@49 282 conv_to< Row<out_eT> >::from(const Base<in_eT, T1>& in, const typename arma_not_cx<in_eT>::result* junk)
Chris@49 283 {
Chris@49 284 arma_extra_debug_sigprint();
Chris@49 285 arma_ignore(junk);
Chris@49 286
Chris@49 287 const unwrap<T1> tmp(in.get_ref());
Chris@49 288 const Mat<in_eT>& X = tmp.M;
Chris@49 289
Chris@49 290 arma_debug_check( ( (X.is_vec() == false) && (X.is_empty() == false) ), "conv_to(): given object can't be interpreted as a vector" );
Chris@49 291
Chris@49 292 Row<out_eT> out(X.n_elem);
Chris@49 293
Chris@49 294 arrayops::convert( out.memptr(), X.memptr(), out.n_elem );
Chris@49 295
Chris@49 296 return out;
Chris@49 297 }
Chris@49 298
Chris@49 299
Chris@49 300
Chris@49 301 template<typename out_eT>
Chris@49 302 template<typename in_eT, typename T1>
Chris@49 303 inline
Chris@49 304 Row<out_eT>
Chris@49 305 conv_to< Row<out_eT> >::from(const Base<in_eT, T1>& in, const typename arma_cx_only<in_eT>::result* junk)
Chris@49 306 {
Chris@49 307 arma_extra_debug_sigprint();
Chris@49 308 arma_ignore(junk);
Chris@49 309
Chris@49 310 const unwrap<T1> tmp(in.get_ref());
Chris@49 311 const Mat<in_eT>& X = tmp.M;
Chris@49 312
Chris@49 313 arma_debug_check( ( (X.is_vec() == false) && (X.is_empty() == false) ), "conv_to(): given object can't be interpreted as a vector" );
Chris@49 314
Chris@49 315 Row<out_eT> out(X.n_rows, X.n_cols);
Chris@49 316
Chris@49 317 arrayops::convert_cx( out.memptr(), X.memptr(), out.n_elem );
Chris@49 318
Chris@49 319 return out;
Chris@49 320 }
Chris@49 321
Chris@49 322
Chris@49 323
Chris@49 324 template<typename out_eT>
Chris@49 325 template<typename in_eT>
Chris@49 326 inline
Chris@49 327 Row<out_eT>
Chris@49 328 conv_to< Row<out_eT> >::from(const std::vector<in_eT>& in, const typename arma_not_cx<in_eT>::result* junk)
Chris@49 329 {
Chris@49 330 arma_extra_debug_sigprint();
Chris@49 331 arma_ignore(junk);
Chris@49 332
Chris@49 333 const uword N = uword( in.size() );
Chris@49 334
Chris@49 335 Row<out_eT> out(N);
Chris@49 336
Chris@49 337 if(N > 0)
Chris@49 338 {
Chris@49 339 out_eT* out_mem = out.memptr();
Chris@49 340 const in_eT* in_mem = &(in[0]);
Chris@49 341
Chris@49 342 for(uword i=0; i<N; ++i)
Chris@49 343 {
Chris@49 344 out_mem[i] = out_eT( in_mem[i] );
Chris@49 345 }
Chris@49 346 }
Chris@49 347
Chris@49 348 return out;
Chris@49 349 }
Chris@49 350
Chris@49 351
Chris@49 352
Chris@49 353 template<typename out_eT>
Chris@49 354 template<typename in_eT>
Chris@49 355 inline
Chris@49 356 Row<out_eT>
Chris@49 357 conv_to< Row<out_eT> >::from(const std::vector<in_eT>& in, const typename arma_cx_only<in_eT>::result* junk)
Chris@49 358 {
Chris@49 359 arma_extra_debug_sigprint();
Chris@49 360 arma_ignore(junk);
Chris@49 361
Chris@49 362 Row<out_eT> out( in.size() );
Chris@49 363
Chris@49 364 typename std::vector<in_eT>::const_iterator in_begin = in.begin();
Chris@49 365 typename std::vector<in_eT>::const_iterator in_end = in.end();
Chris@49 366
Chris@49 367 typename Row<out_eT>::iterator out_begin = out.begin();
Chris@49 368 typename Row<out_eT>::iterator out_end = out.end();
Chris@49 369
Chris@49 370 typename std::vector<in_eT>::const_iterator in_it;
Chris@49 371 typename Row<out_eT>::iterator out_it;
Chris@49 372
Chris@49 373 for(in_it = in_begin, out_it = out_begin; (in_it != in_end) && (out_it != out_end); ++in_it, ++out_it)
Chris@49 374 {
Chris@49 375 out_eT& out_elem = (*out_it);
Chris@49 376 const in_eT& in_elem = (*in_it);
Chris@49 377
Chris@49 378 arrayops::convert_cx_scalar(out_elem, in_elem);
Chris@49 379 }
Chris@49 380
Chris@49 381 return out;
Chris@49 382 }
Chris@49 383
Chris@49 384
Chris@49 385
Chris@49 386 //! conversion to Armadillo column vectors from Armadillo Base objects, as well as from std::vector
Chris@49 387 template<typename out_eT>
Chris@49 388 class conv_to< Col<out_eT> >
Chris@49 389 {
Chris@49 390 public:
Chris@49 391
Chris@49 392 template<typename in_eT, typename T1>
Chris@49 393 inline static Col<out_eT> from(const Base<in_eT, T1>& in, const typename arma_not_cx<in_eT>::result* junk = 0);
Chris@49 394
Chris@49 395 template<typename in_eT, typename T1>
Chris@49 396 inline static Col<out_eT> from(const Base<in_eT, T1>& in, const typename arma_cx_only<in_eT>::result* junk = 0);
Chris@49 397
Chris@49 398
Chris@49 399
Chris@49 400 template<typename in_eT>
Chris@49 401 inline static Col<out_eT> from(const std::vector<in_eT>& in, const typename arma_not_cx<in_eT>::result* junk = 0);
Chris@49 402
Chris@49 403 template<typename in_eT>
Chris@49 404 inline static Col<out_eT> from(const std::vector<in_eT>& in, const typename arma_cx_only<in_eT>::result* junk = 0);
Chris@49 405 };
Chris@49 406
Chris@49 407
Chris@49 408
Chris@49 409 template<typename out_eT>
Chris@49 410 template<typename in_eT, typename T1>
Chris@49 411 inline
Chris@49 412 Col<out_eT>
Chris@49 413 conv_to< Col<out_eT> >::from(const Base<in_eT, T1>& in, const typename arma_not_cx<in_eT>::result* junk)
Chris@49 414 {
Chris@49 415 arma_extra_debug_sigprint();
Chris@49 416 arma_ignore(junk);
Chris@49 417
Chris@49 418 const unwrap<T1> tmp(in.get_ref());
Chris@49 419 const Mat<in_eT>& X = tmp.M;
Chris@49 420
Chris@49 421 arma_debug_check( ( (X.is_vec() == false) && (X.is_empty() == false) ), "conv_to(): given object can't be interpreted as a vector" );
Chris@49 422
Chris@49 423 Col<out_eT> out(X.n_elem);
Chris@49 424
Chris@49 425 arrayops::convert( out.memptr(), X.memptr(), out.n_elem );
Chris@49 426
Chris@49 427 return out;
Chris@49 428 }
Chris@49 429
Chris@49 430
Chris@49 431
Chris@49 432 template<typename out_eT>
Chris@49 433 template<typename in_eT, typename T1>
Chris@49 434 inline
Chris@49 435 Col<out_eT>
Chris@49 436 conv_to< Col<out_eT> >::from(const Base<in_eT, T1>& in, const typename arma_cx_only<in_eT>::result* junk)
Chris@49 437 {
Chris@49 438 arma_extra_debug_sigprint();
Chris@49 439 arma_ignore(junk);
Chris@49 440
Chris@49 441 const unwrap<T1> tmp(in.get_ref());
Chris@49 442 const Mat<in_eT>& X = tmp.M;
Chris@49 443
Chris@49 444 arma_debug_check( ( (X.is_vec() == false) && (X.is_empty() == false) ), "conv_to(): given object can't be interpreted as a vector" );
Chris@49 445
Chris@49 446 Col<out_eT> out(X.n_rows, X.n_cols);
Chris@49 447
Chris@49 448 arrayops::convert_cx( out.memptr(), X.memptr(), out.n_elem );
Chris@49 449
Chris@49 450 return out;
Chris@49 451 }
Chris@49 452
Chris@49 453
Chris@49 454
Chris@49 455 template<typename out_eT>
Chris@49 456 template<typename in_eT>
Chris@49 457 inline
Chris@49 458 Col<out_eT>
Chris@49 459 conv_to< Col<out_eT> >::from(const std::vector<in_eT>& in, const typename arma_not_cx<in_eT>::result* junk)
Chris@49 460 {
Chris@49 461 arma_extra_debug_sigprint();
Chris@49 462 arma_ignore(junk);
Chris@49 463
Chris@49 464 const uword N = uword( in.size() );
Chris@49 465
Chris@49 466 Col<out_eT> out(N);
Chris@49 467
Chris@49 468 if(N > 0)
Chris@49 469 {
Chris@49 470 out_eT* out_mem = out.memptr();
Chris@49 471 const in_eT* in_mem = &(in[0]);
Chris@49 472
Chris@49 473 for(uword i=0; i<N; ++i)
Chris@49 474 {
Chris@49 475 out_mem[i] = out_eT( in_mem[i] );
Chris@49 476 }
Chris@49 477 }
Chris@49 478
Chris@49 479 return out;
Chris@49 480 }
Chris@49 481
Chris@49 482
Chris@49 483
Chris@49 484 template<typename out_eT>
Chris@49 485 template<typename in_eT>
Chris@49 486 inline
Chris@49 487 Col<out_eT>
Chris@49 488 conv_to< Col<out_eT> >::from(const std::vector<in_eT>& in, const typename arma_cx_only<in_eT>::result* junk)
Chris@49 489 {
Chris@49 490 arma_extra_debug_sigprint();
Chris@49 491 arma_ignore(junk);
Chris@49 492
Chris@49 493 Col<out_eT> out( in.size() );
Chris@49 494
Chris@49 495 typename std::vector<in_eT>::const_iterator in_begin = in.begin();
Chris@49 496 typename std::vector<in_eT>::const_iterator in_end = in.end();
Chris@49 497
Chris@49 498 typename Col<out_eT>::iterator out_begin = out.begin();
Chris@49 499 typename Col<out_eT>::iterator out_end = out.end();
Chris@49 500
Chris@49 501 typename std::vector<in_eT>::const_iterator in_it;
Chris@49 502 typename Col<out_eT>::iterator out_it;
Chris@49 503
Chris@49 504 for(in_it = in_begin, out_it = out_begin; (in_it != in_end) && (out_it != out_end); ++in_it, ++out_it)
Chris@49 505 {
Chris@49 506 out_eT& out_elem = (*out_it);
Chris@49 507 const in_eT& in_elem = (*in_it);
Chris@49 508
Chris@49 509 arrayops::convert_cx_scalar(out_elem, in_elem);
Chris@49 510 }
Chris@49 511
Chris@49 512 return out;
Chris@49 513 }
Chris@49 514
Chris@49 515
Chris@49 516
Chris@49 517 //! conversion to Armadillo cubes from Armadillo BaseCube objects
Chris@49 518 template<typename out_eT>
Chris@49 519 class conv_to< Cube<out_eT> >
Chris@49 520 {
Chris@49 521 public:
Chris@49 522
Chris@49 523 template<typename in_eT, typename T1>
Chris@49 524 inline static Cube<out_eT> from(const BaseCube<in_eT, T1>& in, const typename arma_not_cx<in_eT>::result* junk = 0);
Chris@49 525
Chris@49 526 template<typename in_eT, typename T1>
Chris@49 527 inline static Cube<out_eT> from(const BaseCube<in_eT, T1>& in, const typename arma_cx_only<in_eT>::result* junk = 0);
Chris@49 528 };
Chris@49 529
Chris@49 530
Chris@49 531
Chris@49 532 template<typename out_eT>
Chris@49 533 template<typename in_eT, typename T1>
Chris@49 534 inline
Chris@49 535 Cube<out_eT>
Chris@49 536 conv_to< Cube<out_eT> >::from(const BaseCube<in_eT, T1>& in, const typename arma_not_cx<in_eT>::result* junk)
Chris@49 537 {
Chris@49 538 arma_extra_debug_sigprint();
Chris@49 539 arma_ignore(junk);
Chris@49 540
Chris@49 541 const unwrap_cube<T1> tmp( in.get_ref() );
Chris@49 542 const Cube<in_eT>& X = tmp.M;
Chris@49 543
Chris@49 544 Cube<out_eT> out(X.n_rows, X.n_cols, X.n_slices);
Chris@49 545
Chris@49 546 arrayops::convert( out.memptr(), X.memptr(), out.n_elem );
Chris@49 547
Chris@49 548 return out;
Chris@49 549 }
Chris@49 550
Chris@49 551
Chris@49 552
Chris@49 553 template<typename out_eT>
Chris@49 554 template<typename in_eT, typename T1>
Chris@49 555 inline
Chris@49 556 Cube<out_eT>
Chris@49 557 conv_to< Cube<out_eT> >::from(const BaseCube<in_eT, T1>& in, const typename arma_cx_only<in_eT>::result* junk)
Chris@49 558 {
Chris@49 559 arma_extra_debug_sigprint();
Chris@49 560 arma_ignore(junk);
Chris@49 561
Chris@49 562 const unwrap_cube<T1> tmp( in.get_ref() );
Chris@49 563 const Cube<in_eT>& X = tmp.M;
Chris@49 564
Chris@49 565 Cube<out_eT> out(X.n_rows, X.n_cols, X.n_slices);
Chris@49 566
Chris@49 567 arrayops::convert_cx( out.memptr(), X.memptr(), out.n_elem );
Chris@49 568
Chris@49 569 return out;
Chris@49 570 }
Chris@49 571
Chris@49 572
Chris@49 573
Chris@49 574 //! conversion to std::vector from Armadillo Base objects
Chris@49 575 template<typename out_eT>
Chris@49 576 class conv_to< std::vector<out_eT> >
Chris@49 577 {
Chris@49 578 public:
Chris@49 579
Chris@49 580 template<typename in_eT, typename T1>
Chris@49 581 inline static std::vector<out_eT> from(const Base<in_eT, T1>& in, const typename arma_not_cx<in_eT>::result* junk = 0);
Chris@49 582
Chris@49 583 template<typename in_eT, typename T1>
Chris@49 584 inline static std::vector<out_eT> from(const Base<in_eT, T1>& in, const typename arma_cx_only<in_eT>::result* junk = 0);
Chris@49 585 };
Chris@49 586
Chris@49 587
Chris@49 588
Chris@49 589 template<typename out_eT>
Chris@49 590 template<typename in_eT, typename T1>
Chris@49 591 inline
Chris@49 592 std::vector<out_eT>
Chris@49 593 conv_to< std::vector<out_eT> >::from(const Base<in_eT, T1>& in, const typename arma_not_cx<in_eT>::result* junk)
Chris@49 594 {
Chris@49 595 arma_extra_debug_sigprint();
Chris@49 596 arma_ignore(junk);
Chris@49 597
Chris@49 598 const unwrap<T1> tmp(in.get_ref());
Chris@49 599 const Mat<in_eT>& X = tmp.M;
Chris@49 600
Chris@49 601 arma_debug_check( ( (X.is_vec() == false) && (X.is_empty() == false) ), "conv_to(): given object can't be interpreted as a vector" );
Chris@49 602
Chris@49 603 const uword N = X.n_elem;
Chris@49 604
Chris@49 605 std::vector<out_eT> out(N);
Chris@49 606
Chris@49 607 if(N > 0)
Chris@49 608 {
Chris@49 609 out_eT* out_mem = &(out[0]);
Chris@49 610 const in_eT* X_mem = X.memptr();
Chris@49 611
Chris@49 612 for(uword i=0; i<N; ++i)
Chris@49 613 {
Chris@49 614 out_mem[i] = out_eT( X_mem[i] );
Chris@49 615 }
Chris@49 616 }
Chris@49 617
Chris@49 618 return out;
Chris@49 619 }
Chris@49 620
Chris@49 621
Chris@49 622
Chris@49 623 template<typename out_eT>
Chris@49 624 template<typename in_eT, typename T1>
Chris@49 625 inline
Chris@49 626 std::vector<out_eT>
Chris@49 627 conv_to< std::vector<out_eT> >::from(const Base<in_eT, T1>& in, const typename arma_cx_only<in_eT>::result* junk)
Chris@49 628 {
Chris@49 629 arma_extra_debug_sigprint();
Chris@49 630 arma_ignore(junk);
Chris@49 631
Chris@49 632 const unwrap<T1> tmp(in.get_ref());
Chris@49 633 const Mat<in_eT>& X = tmp.M;
Chris@49 634
Chris@49 635 arma_debug_check( ( (X.is_vec() == false) && (X.is_empty() == false) ), "conv_to(): given object can't be interpreted as a vector" );
Chris@49 636
Chris@49 637 std::vector<out_eT> out(X.n_elem);
Chris@49 638
Chris@49 639 typename Mat<in_eT>::const_iterator X_begin = X.begin();
Chris@49 640 typename Mat<in_eT>::const_iterator X_end = X.end();
Chris@49 641
Chris@49 642 typename std::vector<out_eT>::iterator out_begin = out.begin();
Chris@49 643 typename std::vector<out_eT>::iterator out_end = out.end();
Chris@49 644
Chris@49 645 typename Mat<in_eT>::const_iterator X_it;
Chris@49 646 typename std::vector<out_eT>::iterator out_it;
Chris@49 647
Chris@49 648 for(X_it = X_begin, out_it = out_begin; (X_it != X_end) && (out_it != out_end); ++X_it, ++out_it)
Chris@49 649 {
Chris@49 650 out_eT& out_elem = (*out_it);
Chris@49 651 const in_eT& X_elem = (*X_it);
Chris@49 652
Chris@49 653 arrayops::convert_cx_scalar(out_elem, X_elem);
Chris@49 654 }
Chris@49 655
Chris@49 656 return out;
Chris@49 657 }
Chris@49 658
Chris@49 659
Chris@49 660
Chris@49 661 //! @}