annotate armadillo-3.900.4/include/armadillo_bits/subview_elem1_meat.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) 2010-2013 NICTA (www.nicta.com.au)
Chris@49 2 // Copyright (C) 2010-2013 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 subview_elem1
Chris@49 10 //! @{
Chris@49 11
Chris@49 12
Chris@49 13 template<typename eT, typename T1>
Chris@49 14 inline
Chris@49 15 subview_elem1<eT,T1>::~subview_elem1()
Chris@49 16 {
Chris@49 17 arma_extra_debug_sigprint();
Chris@49 18 }
Chris@49 19
Chris@49 20
Chris@49 21 template<typename eT, typename T1>
Chris@49 22 arma_inline
Chris@49 23 subview_elem1<eT,T1>::subview_elem1(const Mat<eT>& in_m, const Base<uword,T1>& in_a)
Chris@49 24 : m(in_m)
Chris@49 25 , a(in_a)
Chris@49 26 {
Chris@49 27 arma_extra_debug_sigprint();
Chris@49 28 }
Chris@49 29
Chris@49 30
Chris@49 31
Chris@49 32 template<typename eT, typename T1>
Chris@49 33 template<typename op_type>
Chris@49 34 inline
Chris@49 35 void
Chris@49 36 subview_elem1<eT,T1>::inplace_op(const eT val)
Chris@49 37 {
Chris@49 38 arma_extra_debug_sigprint();
Chris@49 39
Chris@49 40 Mat<eT>& m_local = const_cast< Mat<eT>& >(m);
Chris@49 41
Chris@49 42 eT* m_mem = m_local.memptr();
Chris@49 43 const uword m_n_elem = m_local.n_elem;
Chris@49 44
Chris@49 45 const unwrap_check_mixed<T1> tmp(a.get_ref(), m_local);
Chris@49 46 const umat& aa = tmp.M;
Chris@49 47
Chris@49 48 arma_debug_check
Chris@49 49 (
Chris@49 50 ( (aa.is_vec() == false) && (aa.is_empty() == false) ),
Chris@49 51 "Mat::elem(): given object is not a vector"
Chris@49 52 );
Chris@49 53
Chris@49 54 const uword* aa_mem = aa.memptr();
Chris@49 55 const uword aa_n_elem = aa.n_elem;
Chris@49 56
Chris@49 57 uword iq,jq;
Chris@49 58 for(iq=0, jq=1; jq < aa_n_elem; iq+=2, jq+=2)
Chris@49 59 {
Chris@49 60 const uword ii = aa_mem[iq];
Chris@49 61 const uword jj = aa_mem[jq];
Chris@49 62
Chris@49 63 arma_debug_check( ( (ii >= m_n_elem) || (jj >= m_n_elem) ), "Mat::elem(): index out of bounds" );
Chris@49 64
Chris@49 65 if(is_same_type<op_type, op_subview_elem_equ >::value == true) { m_mem[ii] = val; m_mem[jj] = val; }
Chris@49 66 else if(is_same_type<op_type, op_subview_elem_inplace_plus >::value == true) { m_mem[ii] += val; m_mem[jj] += val; }
Chris@49 67 else if(is_same_type<op_type, op_subview_elem_inplace_minus>::value == true) { m_mem[ii] -= val; m_mem[jj] -= val; }
Chris@49 68 else if(is_same_type<op_type, op_subview_elem_inplace_schur>::value == true) { m_mem[ii] *= val; m_mem[jj] *= val; }
Chris@49 69 else if(is_same_type<op_type, op_subview_elem_inplace_div >::value == true) { m_mem[ii] /= val; m_mem[jj] /= val; }
Chris@49 70 }
Chris@49 71
Chris@49 72 if(iq < aa_n_elem)
Chris@49 73 {
Chris@49 74 const uword ii = aa_mem[iq];
Chris@49 75
Chris@49 76 arma_debug_check( (ii >= m_n_elem) , "Mat::elem(): index out of bounds" );
Chris@49 77
Chris@49 78 if(is_same_type<op_type, op_subview_elem_equ >::value == true) { m_mem[ii] = val; }
Chris@49 79 else if(is_same_type<op_type, op_subview_elem_inplace_plus >::value == true) { m_mem[ii] += val; }
Chris@49 80 else if(is_same_type<op_type, op_subview_elem_inplace_minus>::value == true) { m_mem[ii] -= val; }
Chris@49 81 else if(is_same_type<op_type, op_subview_elem_inplace_schur>::value == true) { m_mem[ii] *= val; }
Chris@49 82 else if(is_same_type<op_type, op_subview_elem_inplace_div >::value == true) { m_mem[ii] /= val; }
Chris@49 83 }
Chris@49 84 }
Chris@49 85
Chris@49 86
Chris@49 87
Chris@49 88 template<typename eT, typename T1>
Chris@49 89 template<typename op_type, typename T2>
Chris@49 90 inline
Chris@49 91 void
Chris@49 92 subview_elem1<eT,T1>::inplace_op(const subview_elem1<eT,T2>& x)
Chris@49 93 {
Chris@49 94 arma_extra_debug_sigprint();
Chris@49 95
Chris@49 96 subview_elem1<eT,T1>& s = *this;
Chris@49 97
Chris@49 98 if(&(s.m) == &(x.m))
Chris@49 99 {
Chris@49 100 arma_extra_debug_print("subview_elem1::inplace_op(): aliasing detected");
Chris@49 101
Chris@49 102 const Mat<eT> tmp(x);
Chris@49 103
Chris@49 104 if(is_same_type<op_type, op_subview_elem_equ >::value == true) { s.operator= (tmp); }
Chris@49 105 else if(is_same_type<op_type, op_subview_elem_inplace_plus >::value == true) { s.operator+=(tmp); }
Chris@49 106 else if(is_same_type<op_type, op_subview_elem_inplace_minus>::value == true) { s.operator-=(tmp); }
Chris@49 107 else if(is_same_type<op_type, op_subview_elem_inplace_schur>::value == true) { s.operator%=(tmp); }
Chris@49 108 else if(is_same_type<op_type, op_subview_elem_inplace_div >::value == true) { s.operator/=(tmp); }
Chris@49 109 }
Chris@49 110 else
Chris@49 111 {
Chris@49 112 Mat<eT>& s_m_local = const_cast< Mat<eT>& >(s.m);
Chris@49 113 const Mat<eT>& x_m_local = x.m;
Chris@49 114
Chris@49 115 const unwrap_check_mixed<T1> s_tmp(s.a.get_ref(), s_m_local);
Chris@49 116 const unwrap_check_mixed<T2> x_tmp(x.a.get_ref(), s_m_local);
Chris@49 117
Chris@49 118 const umat& s_aa = s_tmp.M;
Chris@49 119 const umat& x_aa = x_tmp.M;
Chris@49 120
Chris@49 121 arma_debug_check
Chris@49 122 (
Chris@49 123 ( ((s_aa.is_vec() == false) && (s_aa.is_empty() == false)) || ((x_aa.is_vec() == false) && (x_aa.is_empty() == false)) ),
Chris@49 124 "Mat::elem(): given object is not a vector"
Chris@49 125 );
Chris@49 126
Chris@49 127 const uword* s_aa_mem = s_aa.memptr();
Chris@49 128 const uword* x_aa_mem = x_aa.memptr();
Chris@49 129
Chris@49 130 const uword s_aa_n_elem = s_aa.n_elem;
Chris@49 131
Chris@49 132 arma_debug_check( (s_aa_n_elem != x_aa.n_elem), "Mat::elem(): size mismatch" );
Chris@49 133
Chris@49 134
Chris@49 135 eT* s_m_mem = s_m_local.memptr();
Chris@49 136 const uword s_m_n_elem = s_m_local.n_elem;
Chris@49 137
Chris@49 138 const eT* x_m_mem = x_m_local.memptr();
Chris@49 139 const uword x_m_n_elem = x_m_local.n_elem;
Chris@49 140
Chris@49 141 uword iq,jq;
Chris@49 142 for(iq=0, jq=1; jq < s_aa_n_elem; iq+=2, jq+=2)
Chris@49 143 {
Chris@49 144 const uword s_ii = s_aa_mem[iq];
Chris@49 145 const uword s_jj = s_aa_mem[jq];
Chris@49 146
Chris@49 147 const uword x_ii = x_aa_mem[iq];
Chris@49 148 const uword x_jj = x_aa_mem[jq];
Chris@49 149
Chris@49 150 arma_debug_check
Chris@49 151 (
Chris@49 152 (s_ii >= s_m_n_elem) || (s_jj >= s_m_n_elem) || (x_ii >= x_m_n_elem) || (x_jj >= x_m_n_elem),
Chris@49 153 "Mat::elem(): index out of bounds"
Chris@49 154 );
Chris@49 155
Chris@49 156 if(is_same_type<op_type, op_subview_elem_equ >::value == true) { s_m_mem[s_ii] = x_m_mem[x_ii]; s_m_mem[s_jj] = x_m_mem[x_jj]; }
Chris@49 157 else if(is_same_type<op_type, op_subview_elem_inplace_plus >::value == true) { s_m_mem[s_ii] += x_m_mem[x_ii]; s_m_mem[s_jj] += x_m_mem[x_jj]; }
Chris@49 158 else if(is_same_type<op_type, op_subview_elem_inplace_minus>::value == true) { s_m_mem[s_ii] -= x_m_mem[x_ii]; s_m_mem[s_jj] -= x_m_mem[x_jj]; }
Chris@49 159 else if(is_same_type<op_type, op_subview_elem_inplace_schur>::value == true) { s_m_mem[s_ii] *= x_m_mem[x_ii]; s_m_mem[s_jj] *= x_m_mem[x_jj]; }
Chris@49 160 else if(is_same_type<op_type, op_subview_elem_inplace_div >::value == true) { s_m_mem[s_ii] /= x_m_mem[x_ii]; s_m_mem[s_jj] /= x_m_mem[x_jj]; }
Chris@49 161 }
Chris@49 162
Chris@49 163 if(iq < s_aa_n_elem)
Chris@49 164 {
Chris@49 165 const uword s_ii = s_aa_mem[iq];
Chris@49 166 const uword x_ii = x_aa_mem[iq];
Chris@49 167
Chris@49 168 arma_debug_check
Chris@49 169 (
Chris@49 170 ( (s_ii >= s_m_n_elem) || (x_ii >= x_m_n_elem) ),
Chris@49 171 "Mat::elem(): index out of bounds"
Chris@49 172 );
Chris@49 173
Chris@49 174 if(is_same_type<op_type, op_subview_elem_equ >::value == true) { s_m_mem[s_ii] = x_m_mem[x_ii]; }
Chris@49 175 else if(is_same_type<op_type, op_subview_elem_inplace_plus >::value == true) { s_m_mem[s_ii] += x_m_mem[x_ii]; }
Chris@49 176 else if(is_same_type<op_type, op_subview_elem_inplace_minus>::value == true) { s_m_mem[s_ii] -= x_m_mem[x_ii]; }
Chris@49 177 else if(is_same_type<op_type, op_subview_elem_inplace_schur>::value == true) { s_m_mem[s_ii] *= x_m_mem[x_ii]; }
Chris@49 178 else if(is_same_type<op_type, op_subview_elem_inplace_div >::value == true) { s_m_mem[s_ii] /= x_m_mem[x_ii]; }
Chris@49 179 }
Chris@49 180 }
Chris@49 181 }
Chris@49 182
Chris@49 183
Chris@49 184
Chris@49 185 template<typename eT, typename T1>
Chris@49 186 template<typename op_type, typename T2>
Chris@49 187 inline
Chris@49 188 void
Chris@49 189 subview_elem1<eT,T1>::inplace_op(const Base<eT,T2>& x)
Chris@49 190 {
Chris@49 191 arma_extra_debug_sigprint();
Chris@49 192
Chris@49 193 Mat<eT>& m_local = const_cast< Mat<eT>& >(m);
Chris@49 194
Chris@49 195 eT* m_mem = m_local.memptr();
Chris@49 196 const uword m_n_elem = m_local.n_elem;
Chris@49 197
Chris@49 198 const unwrap_check_mixed<T1> aa_tmp(a.get_ref(), m_local);
Chris@49 199 const umat& aa = aa_tmp.M;
Chris@49 200
Chris@49 201 arma_debug_check
Chris@49 202 (
Chris@49 203 ( (aa.is_vec() == false) && (aa.is_empty() == false) ),
Chris@49 204 "Mat::elem(): given object is not a vector"
Chris@49 205 );
Chris@49 206
Chris@49 207 const uword* aa_mem = aa.memptr();
Chris@49 208 const uword aa_n_elem = aa.n_elem;
Chris@49 209
Chris@49 210 const Proxy<T2> P(x.get_ref());
Chris@49 211
Chris@49 212 arma_debug_check( (aa_n_elem != P.get_n_elem()), "Mat::elem(): size mismatch" );
Chris@49 213
Chris@49 214 const bool is_alias = P.is_alias(m);
Chris@49 215
Chris@49 216 if( (is_alias == false) && (Proxy<T2>::prefer_at_accessor == false) )
Chris@49 217 {
Chris@49 218 typename Proxy<T2>::ea_type X = P.get_ea();
Chris@49 219
Chris@49 220 uword iq,jq;
Chris@49 221 for(iq=0, jq=1; jq < aa_n_elem; iq+=2, jq+=2)
Chris@49 222 {
Chris@49 223 const uword ii = aa_mem[iq];
Chris@49 224 const uword jj = aa_mem[jq];
Chris@49 225
Chris@49 226 arma_debug_check( ( (ii >= m_n_elem) || (jj >= m_n_elem) ), "Mat::elem(): index out of bounds" );
Chris@49 227
Chris@49 228 if(is_same_type<op_type, op_subview_elem_equ >::value == true) { m_mem[ii] = X[iq]; m_mem[jj] = X[jq]; }
Chris@49 229 else if(is_same_type<op_type, op_subview_elem_inplace_plus >::value == true) { m_mem[ii] += X[iq]; m_mem[jj] += X[jq]; }
Chris@49 230 else if(is_same_type<op_type, op_subview_elem_inplace_minus>::value == true) { m_mem[ii] -= X[iq]; m_mem[jj] -= X[jq]; }
Chris@49 231 else if(is_same_type<op_type, op_subview_elem_inplace_schur>::value == true) { m_mem[ii] *= X[iq]; m_mem[jj] *= X[jq]; }
Chris@49 232 else if(is_same_type<op_type, op_subview_elem_inplace_div >::value == true) { m_mem[ii] /= X[iq]; m_mem[jj] /= X[jq]; }
Chris@49 233 }
Chris@49 234
Chris@49 235 if(iq < aa_n_elem)
Chris@49 236 {
Chris@49 237 const uword ii = aa_mem[iq];
Chris@49 238
Chris@49 239 arma_debug_check( (ii >= m_n_elem) , "Mat::elem(): index out of bounds" );
Chris@49 240
Chris@49 241 if(is_same_type<op_type, op_subview_elem_equ >::value == true) { m_mem[ii] = X[iq]; }
Chris@49 242 else if(is_same_type<op_type, op_subview_elem_inplace_plus >::value == true) { m_mem[ii] += X[iq]; }
Chris@49 243 else if(is_same_type<op_type, op_subview_elem_inplace_minus>::value == true) { m_mem[ii] -= X[iq]; }
Chris@49 244 else if(is_same_type<op_type, op_subview_elem_inplace_schur>::value == true) { m_mem[ii] *= X[iq]; }
Chris@49 245 else if(is_same_type<op_type, op_subview_elem_inplace_div >::value == true) { m_mem[ii] /= X[iq]; }
Chris@49 246 }
Chris@49 247 }
Chris@49 248 else
Chris@49 249 {
Chris@49 250 arma_extra_debug_print("subview_elem1::inplace_op(): aliasing or prefer_at_accessor detected");
Chris@49 251
Chris@49 252 const unwrap_check<typename Proxy<T2>::stored_type> tmp(P.Q, is_alias);
Chris@49 253 const Mat<eT>& M = tmp.M;
Chris@49 254
Chris@49 255 const eT* X = M.memptr();
Chris@49 256
Chris@49 257 uword iq,jq;
Chris@49 258 for(iq=0, jq=1; jq < aa_n_elem; iq+=2, jq+=2)
Chris@49 259 {
Chris@49 260 const uword ii = aa_mem[iq];
Chris@49 261 const uword jj = aa_mem[jq];
Chris@49 262
Chris@49 263 arma_debug_check( ( (ii >= m_n_elem) || (jj >= m_n_elem) ), "Mat::elem(): index out of bounds" );
Chris@49 264
Chris@49 265 if(is_same_type<op_type, op_subview_elem_equ >::value == true) { m_mem[ii] = X[iq]; m_mem[jj] = X[jq]; }
Chris@49 266 else if(is_same_type<op_type, op_subview_elem_inplace_plus >::value == true) { m_mem[ii] += X[iq]; m_mem[jj] += X[jq]; }
Chris@49 267 else if(is_same_type<op_type, op_subview_elem_inplace_minus>::value == true) { m_mem[ii] -= X[iq]; m_mem[jj] -= X[jq]; }
Chris@49 268 else if(is_same_type<op_type, op_subview_elem_inplace_schur>::value == true) { m_mem[ii] *= X[iq]; m_mem[jj] *= X[jq]; }
Chris@49 269 else if(is_same_type<op_type, op_subview_elem_inplace_div >::value == true) { m_mem[ii] /= X[iq]; m_mem[jj] /= X[jq]; }
Chris@49 270 }
Chris@49 271
Chris@49 272 if(iq < aa_n_elem)
Chris@49 273 {
Chris@49 274 const uword ii = aa_mem[iq];
Chris@49 275
Chris@49 276 arma_debug_check( (ii >= m_n_elem) , "Mat::elem(): index out of bounds" );
Chris@49 277
Chris@49 278 if(is_same_type<op_type, op_subview_elem_equ >::value == true) { m_mem[ii] = X[iq]; }
Chris@49 279 else if(is_same_type<op_type, op_subview_elem_inplace_plus >::value == true) { m_mem[ii] += X[iq]; }
Chris@49 280 else if(is_same_type<op_type, op_subview_elem_inplace_minus>::value == true) { m_mem[ii] -= X[iq]; }
Chris@49 281 else if(is_same_type<op_type, op_subview_elem_inplace_schur>::value == true) { m_mem[ii] *= X[iq]; }
Chris@49 282 else if(is_same_type<op_type, op_subview_elem_inplace_div >::value == true) { m_mem[ii] /= X[iq]; }
Chris@49 283 }
Chris@49 284 }
Chris@49 285 }
Chris@49 286
Chris@49 287
Chris@49 288
Chris@49 289 //
Chris@49 290 //
Chris@49 291
Chris@49 292
Chris@49 293
Chris@49 294 template<typename eT, typename T1>
Chris@49 295 arma_inline
Chris@49 296 const Op<subview_elem1<eT,T1>,op_htrans>
Chris@49 297 subview_elem1<eT,T1>::t() const
Chris@49 298 {
Chris@49 299 return Op<subview_elem1<eT,T1>,op_htrans>(*this);
Chris@49 300 }
Chris@49 301
Chris@49 302
Chris@49 303
Chris@49 304 template<typename eT, typename T1>
Chris@49 305 arma_inline
Chris@49 306 const Op<subview_elem1<eT,T1>,op_htrans>
Chris@49 307 subview_elem1<eT,T1>::ht() const
Chris@49 308 {
Chris@49 309 return Op<subview_elem1<eT,T1>,op_htrans>(*this);
Chris@49 310 }
Chris@49 311
Chris@49 312
Chris@49 313
Chris@49 314 template<typename eT, typename T1>
Chris@49 315 arma_inline
Chris@49 316 const Op<subview_elem1<eT,T1>,op_strans>
Chris@49 317 subview_elem1<eT,T1>::st() const
Chris@49 318 {
Chris@49 319 return Op<subview_elem1<eT,T1>,op_strans>(*this);
Chris@49 320 }
Chris@49 321
Chris@49 322
Chris@49 323
Chris@49 324 template<typename eT, typename T1>
Chris@49 325 inline
Chris@49 326 void
Chris@49 327 subview_elem1<eT,T1>::fill(const eT val)
Chris@49 328 {
Chris@49 329 arma_extra_debug_sigprint();
Chris@49 330
Chris@49 331 inplace_op<op_subview_elem_equ>(val);
Chris@49 332 }
Chris@49 333
Chris@49 334
Chris@49 335
Chris@49 336 template<typename eT, typename T1>
Chris@49 337 inline
Chris@49 338 void
Chris@49 339 subview_elem1<eT,T1>::zeros()
Chris@49 340 {
Chris@49 341 arma_extra_debug_sigprint();
Chris@49 342
Chris@49 343 inplace_op<op_subview_elem_equ>(eT(0));
Chris@49 344 }
Chris@49 345
Chris@49 346
Chris@49 347
Chris@49 348 template<typename eT, typename T1>
Chris@49 349 inline
Chris@49 350 void
Chris@49 351 subview_elem1<eT,T1>::ones()
Chris@49 352 {
Chris@49 353 arma_extra_debug_sigprint();
Chris@49 354
Chris@49 355 inplace_op<op_subview_elem_equ>(eT(1));
Chris@49 356 }
Chris@49 357
Chris@49 358
Chris@49 359
Chris@49 360 template<typename eT, typename T1>
Chris@49 361 inline
Chris@49 362 void
Chris@49 363 subview_elem1<eT,T1>::operator+= (const eT val)
Chris@49 364 {
Chris@49 365 arma_extra_debug_sigprint();
Chris@49 366
Chris@49 367 inplace_op<op_subview_elem_inplace_plus>(val);
Chris@49 368 }
Chris@49 369
Chris@49 370
Chris@49 371
Chris@49 372 template<typename eT, typename T1>
Chris@49 373 inline
Chris@49 374 void
Chris@49 375 subview_elem1<eT,T1>::operator-= (const eT val)
Chris@49 376 {
Chris@49 377 arma_extra_debug_sigprint();
Chris@49 378
Chris@49 379 inplace_op<op_subview_elem_inplace_minus>(val);
Chris@49 380 }
Chris@49 381
Chris@49 382
Chris@49 383
Chris@49 384 template<typename eT, typename T1>
Chris@49 385 inline
Chris@49 386 void
Chris@49 387 subview_elem1<eT,T1>::operator*= (const eT val)
Chris@49 388 {
Chris@49 389 arma_extra_debug_sigprint();
Chris@49 390
Chris@49 391 inplace_op<op_subview_elem_inplace_schur>(val);
Chris@49 392 }
Chris@49 393
Chris@49 394
Chris@49 395
Chris@49 396 template<typename eT, typename T1>
Chris@49 397 inline
Chris@49 398 void
Chris@49 399 subview_elem1<eT,T1>::operator/= (const eT val)
Chris@49 400 {
Chris@49 401 arma_extra_debug_sigprint();
Chris@49 402
Chris@49 403 inplace_op<op_subview_elem_inplace_div>(val);
Chris@49 404 }
Chris@49 405
Chris@49 406
Chris@49 407
Chris@49 408 //
Chris@49 409 //
Chris@49 410
Chris@49 411
Chris@49 412
Chris@49 413 template<typename eT, typename T1>
Chris@49 414 template<typename T2>
Chris@49 415 inline
Chris@49 416 void
Chris@49 417 subview_elem1<eT,T1>::operator_equ(const subview_elem1<eT,T2>& x)
Chris@49 418 {
Chris@49 419 arma_extra_debug_sigprint();
Chris@49 420
Chris@49 421 inplace_op<op_subview_elem_equ>(x);
Chris@49 422 }
Chris@49 423
Chris@49 424
Chris@49 425
Chris@49 426
Chris@49 427 template<typename eT, typename T1>
Chris@49 428 template<typename T2>
Chris@49 429 inline
Chris@49 430 void
Chris@49 431 subview_elem1<eT,T1>::operator= (const subview_elem1<eT,T2>& x)
Chris@49 432 {
Chris@49 433 arma_extra_debug_sigprint();
Chris@49 434
Chris@49 435 (*this).operator_equ(x);
Chris@49 436 }
Chris@49 437
Chris@49 438
Chris@49 439
Chris@49 440 //! work around compiler bugs
Chris@49 441 template<typename eT, typename T1>
Chris@49 442 inline
Chris@49 443 void
Chris@49 444 subview_elem1<eT,T1>::operator= (const subview_elem1<eT,T1>& x)
Chris@49 445 {
Chris@49 446 arma_extra_debug_sigprint();
Chris@49 447
Chris@49 448 (*this).operator_equ(x);
Chris@49 449 }
Chris@49 450
Chris@49 451
Chris@49 452
Chris@49 453 template<typename eT, typename T1>
Chris@49 454 template<typename T2>
Chris@49 455 inline
Chris@49 456 void
Chris@49 457 subview_elem1<eT,T1>::operator+= (const subview_elem1<eT,T2>& x)
Chris@49 458 {
Chris@49 459 arma_extra_debug_sigprint();
Chris@49 460
Chris@49 461 inplace_op<op_subview_elem_inplace_plus>(x);
Chris@49 462 }
Chris@49 463
Chris@49 464
Chris@49 465
Chris@49 466 template<typename eT, typename T1>
Chris@49 467 template<typename T2>
Chris@49 468 inline
Chris@49 469 void
Chris@49 470 subview_elem1<eT,T1>::operator-= (const subview_elem1<eT,T2>& x)
Chris@49 471 {
Chris@49 472 arma_extra_debug_sigprint();
Chris@49 473
Chris@49 474 inplace_op<op_subview_elem_inplace_minus>(x);
Chris@49 475 }
Chris@49 476
Chris@49 477
Chris@49 478
Chris@49 479 template<typename eT, typename T1>
Chris@49 480 template<typename T2>
Chris@49 481 inline
Chris@49 482 void
Chris@49 483 subview_elem1<eT,T1>::operator%= (const subview_elem1<eT,T2>& x)
Chris@49 484 {
Chris@49 485 arma_extra_debug_sigprint();
Chris@49 486
Chris@49 487 inplace_op<op_subview_elem_inplace_schur>(x);
Chris@49 488 }
Chris@49 489
Chris@49 490
Chris@49 491
Chris@49 492 template<typename eT, typename T1>
Chris@49 493 template<typename T2>
Chris@49 494 inline
Chris@49 495 void
Chris@49 496 subview_elem1<eT,T1>::operator/= (const subview_elem1<eT,T2>& x)
Chris@49 497 {
Chris@49 498 arma_extra_debug_sigprint();
Chris@49 499
Chris@49 500 inplace_op<op_subview_elem_inplace_div>(x);
Chris@49 501 }
Chris@49 502
Chris@49 503
Chris@49 504
Chris@49 505 template<typename eT, typename T1>
Chris@49 506 template<typename T2>
Chris@49 507 inline
Chris@49 508 void
Chris@49 509 subview_elem1<eT,T1>::operator= (const Base<eT,T2>& x)
Chris@49 510 {
Chris@49 511 arma_extra_debug_sigprint();
Chris@49 512
Chris@49 513 inplace_op<op_subview_elem_equ>(x);
Chris@49 514 }
Chris@49 515
Chris@49 516
Chris@49 517
Chris@49 518 template<typename eT, typename T1>
Chris@49 519 template<typename T2>
Chris@49 520 inline
Chris@49 521 void
Chris@49 522 subview_elem1<eT,T1>::operator+= (const Base<eT,T2>& x)
Chris@49 523 {
Chris@49 524 arma_extra_debug_sigprint();
Chris@49 525
Chris@49 526 inplace_op<op_subview_elem_inplace_plus>(x);
Chris@49 527 }
Chris@49 528
Chris@49 529
Chris@49 530
Chris@49 531 template<typename eT, typename T1>
Chris@49 532 template<typename T2>
Chris@49 533 inline
Chris@49 534 void
Chris@49 535 subview_elem1<eT,T1>::operator-= (const Base<eT,T2>& x)
Chris@49 536 {
Chris@49 537 arma_extra_debug_sigprint();
Chris@49 538
Chris@49 539 inplace_op<op_subview_elem_inplace_minus>(x);
Chris@49 540 }
Chris@49 541
Chris@49 542
Chris@49 543
Chris@49 544 template<typename eT, typename T1>
Chris@49 545 template<typename T2>
Chris@49 546 inline
Chris@49 547 void
Chris@49 548 subview_elem1<eT,T1>::operator%= (const Base<eT,T2>& x)
Chris@49 549 {
Chris@49 550 arma_extra_debug_sigprint();
Chris@49 551
Chris@49 552 inplace_op<op_subview_elem_inplace_schur>(x);
Chris@49 553 }
Chris@49 554
Chris@49 555
Chris@49 556
Chris@49 557 template<typename eT, typename T1>
Chris@49 558 template<typename T2>
Chris@49 559 inline
Chris@49 560 void
Chris@49 561 subview_elem1<eT,T1>::operator/= (const Base<eT,T2>& x)
Chris@49 562 {
Chris@49 563 arma_extra_debug_sigprint();
Chris@49 564
Chris@49 565 inplace_op<op_subview_elem_inplace_div>(x);
Chris@49 566 }
Chris@49 567
Chris@49 568
Chris@49 569
Chris@49 570 //
Chris@49 571 //
Chris@49 572
Chris@49 573
Chris@49 574
Chris@49 575 template<typename eT, typename T1>
Chris@49 576 inline
Chris@49 577 void
Chris@49 578 subview_elem1<eT,T1>::extract(Mat<eT>& actual_out, const subview_elem1<eT,T1>& in)
Chris@49 579 {
Chris@49 580 arma_extra_debug_sigprint();
Chris@49 581
Chris@49 582 const unwrap_check_mixed<T1> tmp1(in.a.get_ref(), actual_out);
Chris@49 583 const umat& aa = tmp1.M;
Chris@49 584
Chris@49 585 arma_debug_check
Chris@49 586 (
Chris@49 587 ( (aa.is_vec() == false) && (aa.is_empty() == false) ),
Chris@49 588 "Mat::elem(): given object is not a vector"
Chris@49 589 );
Chris@49 590
Chris@49 591 const uword* aa_mem = aa.memptr();
Chris@49 592 const uword aa_n_elem = aa.n_elem;
Chris@49 593
Chris@49 594 const Mat<eT>& m_local = in.m;
Chris@49 595
Chris@49 596 const eT* m_mem = m_local.memptr();
Chris@49 597 const uword m_n_elem = m_local.n_elem;
Chris@49 598
Chris@49 599 const bool alias = (&actual_out == &m_local);
Chris@49 600
Chris@49 601 arma_extra_debug_warn(alias, "subview_elem1::extract(): aliasing detected");
Chris@49 602
Chris@49 603 Mat<eT>* tmp_out = alias ? new Mat<eT>() : 0;
Chris@49 604 Mat<eT>& out = alias ? *tmp_out : actual_out;
Chris@49 605
Chris@49 606 out.set_size(aa_n_elem, 1);
Chris@49 607
Chris@49 608 eT* out_mem = out.memptr();
Chris@49 609
Chris@49 610 uword i,j;
Chris@49 611 for(i=0, j=1; j<aa_n_elem; i+=2, j+=2)
Chris@49 612 {
Chris@49 613 const uword ii = aa_mem[i];
Chris@49 614 const uword jj = aa_mem[j];
Chris@49 615
Chris@49 616 arma_debug_check( ( (ii >= m_n_elem) || (jj >= m_n_elem) ), "Mat::elem(): index out of bounds" );
Chris@49 617
Chris@49 618 out_mem[i] = m_mem[ii];
Chris@49 619 out_mem[j] = m_mem[jj];
Chris@49 620 }
Chris@49 621
Chris@49 622 if(i < aa_n_elem)
Chris@49 623 {
Chris@49 624 const uword ii = aa_mem[i];
Chris@49 625
Chris@49 626 arma_debug_check( (ii >= m_n_elem) , "Mat::elem(): index out of bounds" );
Chris@49 627
Chris@49 628 out_mem[i] = m_mem[ii];
Chris@49 629 }
Chris@49 630
Chris@49 631 if(alias == true)
Chris@49 632 {
Chris@49 633 actual_out.steal_mem(out);
Chris@49 634 delete tmp_out;
Chris@49 635 }
Chris@49 636 }
Chris@49 637
Chris@49 638
Chris@49 639
Chris@49 640 template<typename eT, typename T1>
Chris@49 641 template<typename op_type>
Chris@49 642 inline
Chris@49 643 void
Chris@49 644 subview_elem1<eT,T1>::mat_inplace_op(Mat<eT>& out, const subview_elem1& in)
Chris@49 645 {
Chris@49 646 arma_extra_debug_sigprint();
Chris@49 647
Chris@49 648 const unwrap<T1> tmp1(in.a.get_ref());
Chris@49 649 const umat& aa = tmp1.M;
Chris@49 650
Chris@49 651 arma_debug_check
Chris@49 652 (
Chris@49 653 ( (aa.is_vec() == false) && (aa.is_empty() == false) ),
Chris@49 654 "Mat::elem(): given object is not a vector"
Chris@49 655 );
Chris@49 656
Chris@49 657 const uword* aa_mem = aa.memptr();
Chris@49 658 const uword aa_n_elem = aa.n_elem;
Chris@49 659
Chris@49 660 const unwrap_check< Mat<eT> > tmp2(in.m, out);
Chris@49 661 const Mat<eT>& m_local = tmp2.M;
Chris@49 662
Chris@49 663 const eT* m_mem = m_local.memptr();
Chris@49 664 const uword m_n_elem = m_local.n_elem;
Chris@49 665
Chris@49 666 arma_debug_check( (out.n_elem != aa_n_elem), "Mat::elem(): size mismatch" );
Chris@49 667
Chris@49 668 eT* out_mem = out.memptr();
Chris@49 669
Chris@49 670 uword i,j;
Chris@49 671 for(i=0, j=1; j<aa_n_elem; i+=2, j+=2)
Chris@49 672 {
Chris@49 673 const uword ii = aa_mem[i];
Chris@49 674 const uword jj = aa_mem[j];
Chris@49 675
Chris@49 676 arma_debug_check( ( (ii >= m_n_elem) || (jj >= m_n_elem) ), "Mat::elem(): index out of bounds" );
Chris@49 677
Chris@49 678 if(is_same_type<op_type, op_subview_elem_inplace_plus >::value == true) { out_mem[i] += m_mem[ii]; out_mem[j] += m_mem[jj]; }
Chris@49 679 else if(is_same_type<op_type, op_subview_elem_inplace_minus>::value == true) { out_mem[i] -= m_mem[ii]; out_mem[j] -= m_mem[jj]; }
Chris@49 680 else if(is_same_type<op_type, op_subview_elem_inplace_schur>::value == true) { out_mem[i] *= m_mem[ii]; out_mem[j] *= m_mem[jj]; }
Chris@49 681 else if(is_same_type<op_type, op_subview_elem_inplace_div >::value == true) { out_mem[i] /= m_mem[ii]; out_mem[j] /= m_mem[jj]; }
Chris@49 682 }
Chris@49 683
Chris@49 684 if(i < aa_n_elem)
Chris@49 685 {
Chris@49 686 const uword ii = aa_mem[i];
Chris@49 687
Chris@49 688 arma_debug_check( (ii >= m_n_elem) , "Mat::elem(): index out of bounds" );
Chris@49 689
Chris@49 690 if(is_same_type<op_type, op_subview_elem_inplace_plus >::value == true) { out_mem[i] += m_mem[ii]; }
Chris@49 691 else if(is_same_type<op_type, op_subview_elem_inplace_minus>::value == true) { out_mem[i] -= m_mem[ii]; }
Chris@49 692 else if(is_same_type<op_type, op_subview_elem_inplace_schur>::value == true) { out_mem[i] *= m_mem[ii]; }
Chris@49 693 else if(is_same_type<op_type, op_subview_elem_inplace_div >::value == true) { out_mem[i] /= m_mem[ii]; }
Chris@49 694 }
Chris@49 695 }
Chris@49 696
Chris@49 697
Chris@49 698
Chris@49 699 template<typename eT, typename T1>
Chris@49 700 inline
Chris@49 701 void
Chris@49 702 subview_elem1<eT,T1>::plus_inplace(Mat<eT>& out, const subview_elem1& in)
Chris@49 703 {
Chris@49 704 arma_extra_debug_sigprint();
Chris@49 705
Chris@49 706 mat_inplace_op<op_subview_elem_inplace_plus>(out, in);
Chris@49 707 }
Chris@49 708
Chris@49 709
Chris@49 710
Chris@49 711 template<typename eT, typename T1>
Chris@49 712 inline
Chris@49 713 void
Chris@49 714 subview_elem1<eT,T1>::minus_inplace(Mat<eT>& out, const subview_elem1& in)
Chris@49 715 {
Chris@49 716 arma_extra_debug_sigprint();
Chris@49 717
Chris@49 718 mat_inplace_op<op_subview_elem_inplace_minus>(out, in);
Chris@49 719 }
Chris@49 720
Chris@49 721
Chris@49 722
Chris@49 723 template<typename eT, typename T1>
Chris@49 724 inline
Chris@49 725 void
Chris@49 726 subview_elem1<eT,T1>::schur_inplace(Mat<eT>& out, const subview_elem1& in)
Chris@49 727 {
Chris@49 728 arma_extra_debug_sigprint();
Chris@49 729
Chris@49 730 mat_inplace_op<op_subview_elem_inplace_schur>(out, in);
Chris@49 731 }
Chris@49 732
Chris@49 733
Chris@49 734
Chris@49 735 template<typename eT, typename T1>
Chris@49 736 inline
Chris@49 737 void
Chris@49 738 subview_elem1<eT,T1>::div_inplace(Mat<eT>& out, const subview_elem1& in)
Chris@49 739 {
Chris@49 740 arma_extra_debug_sigprint();
Chris@49 741
Chris@49 742 mat_inplace_op<op_subview_elem_inplace_div>(out, in);
Chris@49 743 }
Chris@49 744
Chris@49 745
Chris@49 746
Chris@49 747 //! @}