fn_conv_to.hpp 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718
  1. // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au)
  2. // Copyright 2008-2016 National ICT Australia (NICTA)
  3. //
  4. // Licensed under the Apache License, Version 2.0 (the "License");
  5. // you may not use this file except in compliance with the License.
  6. // You may obtain a copy of the License at
  7. // http://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.
  14. // ------------------------------------------------------------------------
  15. //! \addtogroup fn_conv_to
  16. //! @{
  17. //! conversion from Armadillo Base and BaseCube objects to scalars
  18. //! NOTE: use as_scalar() instead; this functionality is kept only for compatibility with old user code
  19. template<typename out_eT>
  20. class conv_to
  21. {
  22. public:
  23. template<typename in_eT, typename T1>
  24. inline static out_eT from(const Base<in_eT, T1>& in, const typename arma_not_cx<in_eT>::result* junk = 0);
  25. template<typename in_eT, typename T1>
  26. inline static out_eT from(const Base<in_eT, T1>& in, const typename arma_cx_only<in_eT>::result* junk = 0);
  27. template<typename in_eT, typename T1>
  28. inline static out_eT from(const BaseCube<in_eT, T1>& in, const typename arma_not_cx<in_eT>::result* junk = 0);
  29. template<typename in_eT, typename T1>
  30. inline static out_eT from(const BaseCube<in_eT, T1>& in, const typename arma_cx_only<in_eT>::result* junk = 0);
  31. };
  32. template<typename out_eT>
  33. template<typename in_eT, typename T1>
  34. arma_warn_unused
  35. inline
  36. out_eT
  37. conv_to<out_eT>::from(const Base<in_eT, T1>& in, const typename arma_not_cx<in_eT>::result* junk)
  38. {
  39. arma_extra_debug_sigprint();
  40. arma_ignore(junk);
  41. arma_type_check(( is_supported_elem_type<out_eT>::value == false ));
  42. const Proxy<T1> P(in.get_ref());
  43. arma_debug_check( (P.get_n_elem() != 1), "conv_to(): given object doesn't have exactly one element" );
  44. return out_eT(Proxy<T1>::use_at ? P.at(0,0) : P[0]);
  45. }
  46. template<typename out_eT>
  47. template<typename in_eT, typename T1>
  48. arma_warn_unused
  49. inline
  50. out_eT
  51. conv_to<out_eT>::from(const Base<in_eT, T1>& in, const typename arma_cx_only<in_eT>::result* junk)
  52. {
  53. arma_extra_debug_sigprint();
  54. arma_ignore(junk);
  55. arma_type_check(( is_supported_elem_type<out_eT>::value == false ));
  56. const Proxy<T1> P(in.get_ref());
  57. arma_debug_check( (P.get_n_elem() != 1), "conv_to(): given object doesn't have exactly one element" );
  58. out_eT out;
  59. arrayops::convert_cx_scalar(out, (Proxy<T1>::use_at ? P.at(0,0) : P[0]));
  60. return out;
  61. }
  62. template<typename out_eT>
  63. template<typename in_eT, typename T1>
  64. arma_warn_unused
  65. inline
  66. out_eT
  67. conv_to<out_eT>::from(const BaseCube<in_eT, T1>& in, const typename arma_not_cx<in_eT>::result* junk)
  68. {
  69. arma_extra_debug_sigprint();
  70. arma_ignore(junk);
  71. arma_type_check(( is_supported_elem_type<out_eT>::value == false ));
  72. const ProxyCube<T1> P(in.get_ref());
  73. arma_debug_check( (P.get_n_elem() != 1), "conv_to(): given object doesn't have exactly one element" );
  74. return out_eT(ProxyCube<T1>::use_at ? P.at(0,0,0) : P[0]);
  75. }
  76. template<typename out_eT>
  77. template<typename in_eT, typename T1>
  78. arma_warn_unused
  79. inline
  80. out_eT
  81. conv_to<out_eT>::from(const BaseCube<in_eT, T1>& in, const typename arma_cx_only<in_eT>::result* junk)
  82. {
  83. arma_extra_debug_sigprint();
  84. arma_ignore(junk);
  85. arma_type_check(( is_supported_elem_type<out_eT>::value == false ));
  86. const ProxyCube<T1> P(in.get_ref());
  87. arma_debug_check( (P.get_n_elem() != 1), "conv_to(): given object doesn't have exactly one element" );
  88. out_eT out;
  89. arrayops::convert_cx_scalar(out, (ProxyCube<T1>::use_at ? P.at(0,0,0) : P[0]));
  90. return out;
  91. }
  92. //! conversion to Armadillo matrices from Armadillo Base objects, as well as from std::vector
  93. template<typename out_eT>
  94. class conv_to< Mat<out_eT> >
  95. {
  96. public:
  97. template<typename in_eT, typename T1>
  98. inline static Mat<out_eT> from(const Base<in_eT, T1>& in, const typename arma_not_cx<in_eT>::result* junk = 0);
  99. template<typename in_eT, typename T1>
  100. inline static Mat<out_eT> from(const Base<in_eT, T1>& in, const typename arma_cx_only<in_eT>::result* junk = 0);
  101. template<typename T1>
  102. inline static Mat<out_eT> from(const SpBase<out_eT, T1>& in);
  103. template<typename in_eT>
  104. inline static Mat<out_eT> from(const std::vector<in_eT>& in, const typename arma_not_cx<in_eT>::result* junk = 0);
  105. template<typename in_eT>
  106. inline static Mat<out_eT> from(const std::vector<in_eT>& in, const typename arma_cx_only<in_eT>::result* junk = 0);
  107. };
  108. template<typename out_eT>
  109. template<typename in_eT, typename T1>
  110. arma_warn_unused
  111. inline
  112. Mat<out_eT>
  113. conv_to< Mat<out_eT> >::from(const Base<in_eT, T1>& in, const typename arma_not_cx<in_eT>::result* junk)
  114. {
  115. arma_extra_debug_sigprint();
  116. arma_ignore(junk);
  117. const quasi_unwrap<T1> tmp(in.get_ref());
  118. const Mat<in_eT>& X = tmp.M;
  119. Mat<out_eT> out(X.n_rows, X.n_cols);
  120. arrayops::convert( out.memptr(), X.memptr(), X.n_elem );
  121. return out;
  122. }
  123. template<typename out_eT>
  124. template<typename in_eT, typename T1>
  125. arma_warn_unused
  126. inline
  127. Mat<out_eT>
  128. conv_to< Mat<out_eT> >::from(const Base<in_eT, T1>& in, const typename arma_cx_only<in_eT>::result* junk)
  129. {
  130. arma_extra_debug_sigprint();
  131. arma_ignore(junk);
  132. const quasi_unwrap<T1> tmp(in.get_ref());
  133. const Mat<in_eT>& X = tmp.M;
  134. Mat<out_eT> out(X.n_rows, X.n_cols);
  135. arrayops::convert_cx( out.memptr(), X.memptr(), X.n_elem );
  136. return out;
  137. }
  138. template<typename out_eT>
  139. template<typename T1>
  140. arma_warn_unused
  141. inline
  142. Mat<out_eT>
  143. conv_to< Mat<out_eT> >::from(const SpBase<out_eT, T1>& in)
  144. {
  145. arma_extra_debug_sigprint();
  146. return Mat<out_eT>(in.get_ref());
  147. }
  148. template<typename out_eT>
  149. template<typename in_eT>
  150. arma_warn_unused
  151. inline
  152. Mat<out_eT>
  153. conv_to< Mat<out_eT> >::from(const std::vector<in_eT>& in, const typename arma_not_cx<in_eT>::result* junk)
  154. {
  155. arma_extra_debug_sigprint();
  156. arma_ignore(junk);
  157. const uword N = uword( in.size() );
  158. Mat<out_eT> out(N, 1);
  159. if(N > 0)
  160. {
  161. arrayops::convert( out.memptr(), &(in[0]), N );
  162. }
  163. return out;
  164. }
  165. template<typename out_eT>
  166. template<typename in_eT>
  167. arma_warn_unused
  168. inline
  169. Mat<out_eT>
  170. conv_to< Mat<out_eT> >::from(const std::vector<in_eT>& in, const typename arma_cx_only<in_eT>::result* junk)
  171. {
  172. arma_extra_debug_sigprint();
  173. arma_ignore(junk);
  174. const uword N = uword( in.size() );
  175. Mat<out_eT> out(N, 1);
  176. if(N > 0)
  177. {
  178. arrayops::convert_cx( out.memptr(), &(in[0]), N );
  179. }
  180. return out;
  181. }
  182. //! conversion to Armadillo row vectors from Armadillo Base objects, as well as from std::vector
  183. template<typename out_eT>
  184. class conv_to< Row<out_eT> >
  185. {
  186. public:
  187. template<typename in_eT, typename T1>
  188. inline static Row<out_eT> from(const Base<in_eT, T1>& in, const typename arma_not_cx<in_eT>::result* junk = 0);
  189. template<typename in_eT, typename T1>
  190. inline static Row<out_eT> from(const Base<in_eT, T1>& in, const typename arma_cx_only<in_eT>::result* junk = 0);
  191. template<typename in_eT>
  192. inline static Row<out_eT> from(const std::vector<in_eT>& in, const typename arma_not_cx<in_eT>::result* junk = 0);
  193. template<typename in_eT>
  194. inline static Row<out_eT> from(const std::vector<in_eT>& in, const typename arma_cx_only<in_eT>::result* junk = 0);
  195. };
  196. template<typename out_eT>
  197. template<typename in_eT, typename T1>
  198. arma_warn_unused
  199. inline
  200. Row<out_eT>
  201. conv_to< Row<out_eT> >::from(const Base<in_eT, T1>& in, const typename arma_not_cx<in_eT>::result* junk)
  202. {
  203. arma_extra_debug_sigprint();
  204. arma_ignore(junk);
  205. const quasi_unwrap<T1> tmp(in.get_ref());
  206. const Mat<in_eT>& X = tmp.M;
  207. arma_debug_check( ( (X.is_vec() == false) && (X.is_empty() == false) ), "conv_to(): given object can't be interpreted as a vector" );
  208. Row<out_eT> out(X.n_elem);
  209. arrayops::convert( out.memptr(), X.memptr(), X.n_elem );
  210. return out;
  211. }
  212. template<typename out_eT>
  213. template<typename in_eT, typename T1>
  214. arma_warn_unused
  215. inline
  216. Row<out_eT>
  217. conv_to< Row<out_eT> >::from(const Base<in_eT, T1>& in, const typename arma_cx_only<in_eT>::result* junk)
  218. {
  219. arma_extra_debug_sigprint();
  220. arma_ignore(junk);
  221. const quasi_unwrap<T1> tmp(in.get_ref());
  222. const Mat<in_eT>& X = tmp.M;
  223. arma_debug_check( ( (X.is_vec() == false) && (X.is_empty() == false) ), "conv_to(): given object can't be interpreted as a vector" );
  224. Row<out_eT> out(X.n_rows, X.n_cols);
  225. arrayops::convert_cx( out.memptr(), X.memptr(), X.n_elem );
  226. return out;
  227. }
  228. template<typename out_eT>
  229. template<typename in_eT>
  230. arma_warn_unused
  231. inline
  232. Row<out_eT>
  233. conv_to< Row<out_eT> >::from(const std::vector<in_eT>& in, const typename arma_not_cx<in_eT>::result* junk)
  234. {
  235. arma_extra_debug_sigprint();
  236. arma_ignore(junk);
  237. const uword N = uword( in.size() );
  238. Row<out_eT> out(N);
  239. if(N > 0)
  240. {
  241. arrayops::convert( out.memptr(), &(in[0]), N );
  242. }
  243. return out;
  244. }
  245. template<typename out_eT>
  246. template<typename in_eT>
  247. arma_warn_unused
  248. inline
  249. Row<out_eT>
  250. conv_to< Row<out_eT> >::from(const std::vector<in_eT>& in, const typename arma_cx_only<in_eT>::result* junk)
  251. {
  252. arma_extra_debug_sigprint();
  253. arma_ignore(junk);
  254. const uword N = uword( in.size() );
  255. Row<out_eT> out(N);
  256. if(N > 0)
  257. {
  258. arrayops::convert_cx( out.memptr(), &(in[0]), N );
  259. }
  260. return out;
  261. }
  262. //! conversion to Armadillo column vectors from Armadillo Base objects, as well as from std::vector
  263. template<typename out_eT>
  264. class conv_to< Col<out_eT> >
  265. {
  266. public:
  267. template<typename in_eT, typename T1>
  268. inline static Col<out_eT> from(const Base<in_eT, T1>& in, const typename arma_not_cx<in_eT>::result* junk = 0);
  269. template<typename in_eT, typename T1>
  270. inline static Col<out_eT> from(const Base<in_eT, T1>& in, const typename arma_cx_only<in_eT>::result* junk = 0);
  271. template<typename in_eT>
  272. inline static Col<out_eT> from(const std::vector<in_eT>& in, const typename arma_not_cx<in_eT>::result* junk = 0);
  273. template<typename in_eT>
  274. inline static Col<out_eT> from(const std::vector<in_eT>& in, const typename arma_cx_only<in_eT>::result* junk = 0);
  275. };
  276. template<typename out_eT>
  277. template<typename in_eT, typename T1>
  278. arma_warn_unused
  279. inline
  280. Col<out_eT>
  281. conv_to< Col<out_eT> >::from(const Base<in_eT, T1>& in, const typename arma_not_cx<in_eT>::result* junk)
  282. {
  283. arma_extra_debug_sigprint();
  284. arma_ignore(junk);
  285. const quasi_unwrap<T1> tmp(in.get_ref());
  286. const Mat<in_eT>& X = tmp.M;
  287. arma_debug_check( ( (X.is_vec() == false) && (X.is_empty() == false) ), "conv_to(): given object can't be interpreted as a vector" );
  288. Col<out_eT> out(X.n_elem);
  289. arrayops::convert( out.memptr(), X.memptr(), X.n_elem );
  290. return out;
  291. }
  292. template<typename out_eT>
  293. template<typename in_eT, typename T1>
  294. arma_warn_unused
  295. inline
  296. Col<out_eT>
  297. conv_to< Col<out_eT> >::from(const Base<in_eT, T1>& in, const typename arma_cx_only<in_eT>::result* junk)
  298. {
  299. arma_extra_debug_sigprint();
  300. arma_ignore(junk);
  301. const quasi_unwrap<T1> tmp(in.get_ref());
  302. const Mat<in_eT>& X = tmp.M;
  303. arma_debug_check( ( (X.is_vec() == false) && (X.is_empty() == false) ), "conv_to(): given object can't be interpreted as a vector" );
  304. Col<out_eT> out(X.n_rows, X.n_cols);
  305. arrayops::convert_cx( out.memptr(), X.memptr(), X.n_elem );
  306. return out;
  307. }
  308. template<typename out_eT>
  309. template<typename in_eT>
  310. arma_warn_unused
  311. inline
  312. Col<out_eT>
  313. conv_to< Col<out_eT> >::from(const std::vector<in_eT>& in, const typename arma_not_cx<in_eT>::result* junk)
  314. {
  315. arma_extra_debug_sigprint();
  316. arma_ignore(junk);
  317. const uword N = uword( in.size() );
  318. Col<out_eT> out(N);
  319. if(N > 0)
  320. {
  321. arrayops::convert( out.memptr(), &(in[0]), N );
  322. }
  323. return out;
  324. }
  325. template<typename out_eT>
  326. template<typename in_eT>
  327. arma_warn_unused
  328. inline
  329. Col<out_eT>
  330. conv_to< Col<out_eT> >::from(const std::vector<in_eT>& in, const typename arma_cx_only<in_eT>::result* junk)
  331. {
  332. arma_extra_debug_sigprint();
  333. arma_ignore(junk);
  334. const uword N = uword( in.size() );
  335. Col<out_eT> out(N);
  336. if(N > 0)
  337. {
  338. arrayops::convert_cx( out.memptr(), &(in[0]), N );
  339. }
  340. return out;
  341. }
  342. //! convert between SpMat types
  343. template<typename out_eT>
  344. class conv_to< SpMat<out_eT> >
  345. {
  346. public:
  347. template<typename in_eT, typename T1>
  348. inline static SpMat<out_eT> from(const SpBase<in_eT, T1>& in, const typename arma_not_cx<in_eT>::result* junk = 0);
  349. template<typename in_eT, typename T1>
  350. inline static SpMat<out_eT> from(const SpBase<in_eT, T1>& in, const typename arma_cx_only<in_eT>::result* junk = 0);
  351. template<typename T1>
  352. inline static SpMat<out_eT> from(const Base<out_eT, T1>& in);
  353. };
  354. template<typename out_eT>
  355. template<typename in_eT, typename T1>
  356. arma_warn_unused
  357. inline
  358. SpMat<out_eT>
  359. conv_to< SpMat<out_eT> >::from(const SpBase<in_eT, T1>& in, const typename arma_not_cx<in_eT>::result* junk)
  360. {
  361. arma_extra_debug_sigprint();
  362. arma_ignore(junk);
  363. const unwrap_spmat<T1> tmp(in.get_ref());
  364. const SpMat<in_eT>& X = tmp.M;
  365. SpMat<out_eT> out(arma_layout_indicator(), X);
  366. arrayops::convert( access::rwp(out.values), X.values, X.n_nonzero );
  367. out.remove_zeros();
  368. return out;
  369. }
  370. template<typename out_eT>
  371. template<typename in_eT, typename T1>
  372. arma_warn_unused
  373. inline
  374. SpMat<out_eT>
  375. conv_to< SpMat<out_eT> >::from(const SpBase<in_eT, T1>& in, const typename arma_cx_only<in_eT>::result* junk)
  376. {
  377. arma_extra_debug_sigprint();
  378. arma_ignore(junk);
  379. const unwrap_spmat<T1> tmp(in.get_ref());
  380. const SpMat<in_eT>& X = tmp.M;
  381. SpMat<out_eT> out(arma_layout_indicator(), X);
  382. arrayops::convert_cx( access::rwp(out.values), X.values, X.n_nonzero );
  383. out.remove_zeros();
  384. return out;
  385. }
  386. template<typename out_eT>
  387. template<typename T1>
  388. arma_warn_unused
  389. inline
  390. SpMat<out_eT>
  391. conv_to< SpMat<out_eT> >::from(const Base<out_eT, T1>& in)
  392. {
  393. arma_extra_debug_sigprint();
  394. return SpMat<out_eT>(in.get_ref());
  395. }
  396. //! conversion to Armadillo cubes from Armadillo BaseCube objects
  397. template<typename out_eT>
  398. class conv_to< Cube<out_eT> >
  399. {
  400. public:
  401. template<typename in_eT, typename T1>
  402. inline static Cube<out_eT> from(const BaseCube<in_eT, T1>& in, const typename arma_not_cx<in_eT>::result* junk = 0);
  403. template<typename in_eT, typename T1>
  404. inline static Cube<out_eT> from(const BaseCube<in_eT, T1>& in, const typename arma_cx_only<in_eT>::result* junk = 0);
  405. };
  406. template<typename out_eT>
  407. template<typename in_eT, typename T1>
  408. arma_warn_unused
  409. inline
  410. Cube<out_eT>
  411. conv_to< Cube<out_eT> >::from(const BaseCube<in_eT, T1>& in, const typename arma_not_cx<in_eT>::result* junk)
  412. {
  413. arma_extra_debug_sigprint();
  414. arma_ignore(junk);
  415. const unwrap_cube<T1> tmp( in.get_ref() );
  416. const Cube<in_eT>& X = tmp.M;
  417. Cube<out_eT> out(X.n_rows, X.n_cols, X.n_slices);
  418. arrayops::convert( out.memptr(), X.memptr(), X.n_elem );
  419. return out;
  420. }
  421. template<typename out_eT>
  422. template<typename in_eT, typename T1>
  423. arma_warn_unused
  424. inline
  425. Cube<out_eT>
  426. conv_to< Cube<out_eT> >::from(const BaseCube<in_eT, T1>& in, const typename arma_cx_only<in_eT>::result* junk)
  427. {
  428. arma_extra_debug_sigprint();
  429. arma_ignore(junk);
  430. const unwrap_cube<T1> tmp( in.get_ref() );
  431. const Cube<in_eT>& X = tmp.M;
  432. Cube<out_eT> out(X.n_rows, X.n_cols, X.n_slices);
  433. arrayops::convert_cx( out.memptr(), X.memptr(), X.n_elem );
  434. return out;
  435. }
  436. //! conversion to std::vector from Armadillo Base objects
  437. template<typename out_eT>
  438. class conv_to< std::vector<out_eT> >
  439. {
  440. public:
  441. template<typename in_eT, typename T1>
  442. inline static std::vector<out_eT> from(const Base<in_eT, T1>& in, const typename arma_not_cx<in_eT>::result* junk = 0);
  443. template<typename in_eT, typename T1>
  444. inline static std::vector<out_eT> from(const Base<in_eT, T1>& in, const typename arma_cx_only<in_eT>::result* junk = 0);
  445. };
  446. template<typename out_eT>
  447. template<typename in_eT, typename T1>
  448. arma_warn_unused
  449. inline
  450. std::vector<out_eT>
  451. conv_to< std::vector<out_eT> >::from(const Base<in_eT, T1>& in, const typename arma_not_cx<in_eT>::result* junk)
  452. {
  453. arma_extra_debug_sigprint();
  454. arma_ignore(junk);
  455. const quasi_unwrap<T1> tmp(in.get_ref());
  456. const Mat<in_eT>& X = tmp.M;
  457. arma_debug_check( ( (X.is_vec() == false) && (X.is_empty() == false) ), "conv_to(): given object can't be interpreted as a vector" );
  458. const uword N = X.n_elem;
  459. std::vector<out_eT> out(N);
  460. if(N > 0)
  461. {
  462. arrayops::convert( &(out[0]), X.memptr(), N );
  463. }
  464. return out;
  465. }
  466. template<typename out_eT>
  467. template<typename in_eT, typename T1>
  468. arma_warn_unused
  469. inline
  470. std::vector<out_eT>
  471. conv_to< std::vector<out_eT> >::from(const Base<in_eT, T1>& in, const typename arma_cx_only<in_eT>::result* junk)
  472. {
  473. arma_extra_debug_sigprint();
  474. arma_ignore(junk);
  475. const quasi_unwrap<T1> tmp(in.get_ref());
  476. const Mat<in_eT>& X = tmp.M;
  477. arma_debug_check( ( (X.is_vec() == false) && (X.is_empty() == false) ), "conv_to(): given object can't be interpreted as a vector" );
  478. const uword N = X.n_elem;
  479. std::vector<out_eT> out(N);
  480. if(N > 0)
  481. {
  482. arrayops::convert_cx( &(out[0]), X.memptr(), N );
  483. }
  484. return out;
  485. }
  486. //! @}