annotate armadillo-3.900.4/include/armadillo_bits/diagmat_proxy.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 diagmat_proxy
Chris@49 10 //! @{
Chris@49 11
Chris@49 12
Chris@49 13
Chris@49 14 template<typename T1>
Chris@49 15 class diagmat_proxy_default
Chris@49 16 {
Chris@49 17 public:
Chris@49 18
Chris@49 19 typedef typename T1::elem_type elem_type;
Chris@49 20 typedef typename get_pod_type<elem_type>::result pod_type;
Chris@49 21
Chris@49 22 inline
Chris@49 23 diagmat_proxy_default(const T1& X)
Chris@49 24 : P ( X )
Chris@49 25 , P_is_vec( (resolves_to_vector<T1>::value) || (P.get_n_rows() == 1) || (P.get_n_cols() == 1) )
Chris@49 26 , P_is_col( T1::is_col || (P.get_n_cols() == 1) )
Chris@49 27 , n_elem ( P_is_vec ? P.get_n_elem() : (std::min)(P.get_n_elem(), P.get_n_rows()) )
Chris@49 28 {
Chris@49 29 arma_extra_debug_sigprint();
Chris@49 30
Chris@49 31 arma_debug_check
Chris@49 32 (
Chris@49 33 (P_is_vec == false) && (P.get_n_rows() != P.get_n_cols()),
Chris@49 34 "diagmat(): only vectors and square matrices are accepted"
Chris@49 35 );
Chris@49 36 }
Chris@49 37
Chris@49 38
Chris@49 39 arma_inline
Chris@49 40 elem_type
Chris@49 41 operator[](const uword i) const
Chris@49 42 {
Chris@49 43 if(Proxy<T1>::prefer_at_accessor == false)
Chris@49 44 {
Chris@49 45 return P_is_vec ? P[i] : P.at(i,i);
Chris@49 46 }
Chris@49 47 else
Chris@49 48 {
Chris@49 49 if(P_is_vec)
Chris@49 50 {
Chris@49 51 return (P_is_col) ? P.at(i,0) : P.at(0,i);
Chris@49 52 }
Chris@49 53 else
Chris@49 54 {
Chris@49 55 return P.at(i,i);
Chris@49 56 }
Chris@49 57 }
Chris@49 58 }
Chris@49 59
Chris@49 60
Chris@49 61 arma_inline
Chris@49 62 elem_type
Chris@49 63 at(const uword row, const uword col) const
Chris@49 64 {
Chris@49 65 if(row == col)
Chris@49 66 {
Chris@49 67 if(Proxy<T1>::prefer_at_accessor == false)
Chris@49 68 {
Chris@49 69 return (P_is_vec) ? P[row] : P.at(row,row);
Chris@49 70 }
Chris@49 71 else
Chris@49 72 {
Chris@49 73 if(P_is_vec)
Chris@49 74 {
Chris@49 75 return (P_is_col) ? P.at(row,0) : P.at(0,row);
Chris@49 76 }
Chris@49 77 else
Chris@49 78 {
Chris@49 79 return P.at(row,row);
Chris@49 80 }
Chris@49 81 }
Chris@49 82 }
Chris@49 83 else
Chris@49 84 {
Chris@49 85 return elem_type(0);
Chris@49 86 }
Chris@49 87 }
Chris@49 88
Chris@49 89
Chris@49 90 const Proxy<T1> P;
Chris@49 91 const bool P_is_vec;
Chris@49 92 const bool P_is_col;
Chris@49 93 const uword n_elem;
Chris@49 94 };
Chris@49 95
Chris@49 96
Chris@49 97
Chris@49 98 template<typename T1>
Chris@49 99 class diagmat_proxy_fixed
Chris@49 100 {
Chris@49 101 public:
Chris@49 102
Chris@49 103 typedef typename T1::elem_type elem_type;
Chris@49 104 typedef typename get_pod_type<elem_type>::result pod_type;
Chris@49 105
Chris@49 106 inline
Chris@49 107 diagmat_proxy_fixed(const T1& X)
Chris@49 108 : P(X)
Chris@49 109 {
Chris@49 110 arma_extra_debug_sigprint();
Chris@49 111
Chris@49 112 arma_debug_check
Chris@49 113 (
Chris@49 114 (P_is_vec == false) && (T1::n_rows != T1::n_cols),
Chris@49 115 "diagmat(): only vectors and square matrices are accepted"
Chris@49 116 );
Chris@49 117 }
Chris@49 118
Chris@49 119
Chris@49 120 arma_inline
Chris@49 121 elem_type
Chris@49 122 operator[](const uword i) const
Chris@49 123 {
Chris@49 124 return (P_is_vec) ? P[i] : P.at(i,i);
Chris@49 125 }
Chris@49 126
Chris@49 127
Chris@49 128 arma_inline
Chris@49 129 elem_type
Chris@49 130 at(const uword row, const uword col) const
Chris@49 131 {
Chris@49 132 if(row == col)
Chris@49 133 {
Chris@49 134 return (P_is_vec) ? P[row] : P.at(row,row);
Chris@49 135 }
Chris@49 136 else
Chris@49 137 {
Chris@49 138 return elem_type(0);
Chris@49 139 }
Chris@49 140 }
Chris@49 141
Chris@49 142 const T1& P;
Chris@49 143
Chris@49 144 static const bool P_is_vec = (T1::n_rows == 1) || (T1::n_cols == 1);
Chris@49 145 static const uword n_elem = P_is_vec ? T1::n_elem : ( (T1::n_elem < T1::n_rows) ? T1::n_elem : T1::n_rows );
Chris@49 146 };
Chris@49 147
Chris@49 148
Chris@49 149
Chris@49 150 template<typename T1, bool condition>
Chris@49 151 struct diagmat_proxy_redirect {};
Chris@49 152
Chris@49 153 template<typename T1>
Chris@49 154 struct diagmat_proxy_redirect<T1, false> { typedef diagmat_proxy_default<T1> result; };
Chris@49 155
Chris@49 156 template<typename T1>
Chris@49 157 struct diagmat_proxy_redirect<T1, true> { typedef diagmat_proxy_fixed<T1> result; };
Chris@49 158
Chris@49 159
Chris@49 160 template<typename T1>
Chris@49 161 class diagmat_proxy : public diagmat_proxy_redirect<T1, is_Mat_fixed<T1>::value >::result
Chris@49 162 {
Chris@49 163 public:
Chris@49 164 inline diagmat_proxy(const T1& X)
Chris@49 165 : diagmat_proxy_redirect< T1, is_Mat_fixed<T1>::value >::result(X)
Chris@49 166 {
Chris@49 167 }
Chris@49 168 };
Chris@49 169
Chris@49 170
Chris@49 171
Chris@49 172 template<typename eT>
Chris@49 173 class diagmat_proxy< Mat<eT> >
Chris@49 174 {
Chris@49 175 public:
Chris@49 176
Chris@49 177 typedef eT elem_type;
Chris@49 178 typedef typename get_pod_type<elem_type>::result pod_type;
Chris@49 179
Chris@49 180 inline
Chris@49 181 diagmat_proxy(const Mat<eT>& X)
Chris@49 182 : P ( X )
Chris@49 183 , P_is_vec( (X.n_rows == 1) || (X.n_cols == 1) )
Chris@49 184 , n_elem ( P_is_vec ? X.n_elem : (std::min)(X.n_elem, X.n_rows) )
Chris@49 185 {
Chris@49 186 arma_extra_debug_sigprint();
Chris@49 187
Chris@49 188 arma_debug_check
Chris@49 189 (
Chris@49 190 (P_is_vec == false) && (P.n_rows != P.n_cols),
Chris@49 191 "diagmat(): only vectors and square matrices are accepted"
Chris@49 192 );
Chris@49 193 }
Chris@49 194
Chris@49 195 arma_inline elem_type operator[] (const uword i) const { return P_is_vec ? P[i] : P.at(i,i); }
Chris@49 196 arma_inline elem_type at (const uword row, const uword col) const { return (row == col) ? ( P_is_vec ? P[row] : P.at(row,row) ) : elem_type(0); }
Chris@49 197
Chris@49 198 const Mat<eT>& P;
Chris@49 199 const bool P_is_vec;
Chris@49 200 const uword n_elem;
Chris@49 201 };
Chris@49 202
Chris@49 203
Chris@49 204
Chris@49 205 template<typename eT>
Chris@49 206 class diagmat_proxy< Row<eT> >
Chris@49 207 {
Chris@49 208 public:
Chris@49 209
Chris@49 210 typedef eT elem_type;
Chris@49 211 typedef typename get_pod_type<elem_type>::result pod_type;
Chris@49 212
Chris@49 213
Chris@49 214 inline
Chris@49 215 diagmat_proxy(const Row<eT>& X)
Chris@49 216 : P(X)
Chris@49 217 , n_elem(X.n_elem)
Chris@49 218 {
Chris@49 219 arma_extra_debug_sigprint();
Chris@49 220 }
Chris@49 221
Chris@49 222 arma_inline elem_type operator[] (const uword i) const { return P[i]; }
Chris@49 223 arma_inline elem_type at (const uword row, const uword col) const { return (row == col) ? P[row] : elem_type(0); }
Chris@49 224
Chris@49 225 static const bool P_is_vec = true;
Chris@49 226
Chris@49 227 const Row<eT>& P;
Chris@49 228 const uword n_elem;
Chris@49 229 };
Chris@49 230
Chris@49 231
Chris@49 232
Chris@49 233 template<typename eT>
Chris@49 234 class diagmat_proxy< Col<eT> >
Chris@49 235 {
Chris@49 236 public:
Chris@49 237
Chris@49 238 typedef eT elem_type;
Chris@49 239 typedef typename get_pod_type<elem_type>::result pod_type;
Chris@49 240
Chris@49 241
Chris@49 242 inline
Chris@49 243 diagmat_proxy(const Col<eT>& X)
Chris@49 244 : P(X)
Chris@49 245 , n_elem(X.n_elem)
Chris@49 246 {
Chris@49 247 arma_extra_debug_sigprint();
Chris@49 248 }
Chris@49 249
Chris@49 250 arma_inline elem_type operator[] (const uword i) const { return P[i]; }
Chris@49 251 arma_inline elem_type at (const uword row, const uword col) const { return (row == col) ? P[row] : elem_type(0); }
Chris@49 252
Chris@49 253 static const bool P_is_vec = true;
Chris@49 254
Chris@49 255 const Col<eT>& P;
Chris@49 256 const uword n_elem;
Chris@49 257 };
Chris@49 258
Chris@49 259
Chris@49 260
Chris@49 261 template<typename eT>
Chris@49 262 class diagmat_proxy< subview_row<eT> >
Chris@49 263 {
Chris@49 264 public:
Chris@49 265
Chris@49 266 typedef eT elem_type;
Chris@49 267 typedef typename get_pod_type<elem_type>::result pod_type;
Chris@49 268
Chris@49 269
Chris@49 270 inline
Chris@49 271 diagmat_proxy(const subview_row<eT>& X)
Chris@49 272 : P(X)
Chris@49 273 , n_elem(X.n_elem)
Chris@49 274 {
Chris@49 275 arma_extra_debug_sigprint();
Chris@49 276 }
Chris@49 277
Chris@49 278 arma_inline elem_type operator[] (const uword i) const { return P[i]; }
Chris@49 279 arma_inline elem_type at (const uword row, const uword col) const { return (row == col) ? P[row] : elem_type(0); }
Chris@49 280
Chris@49 281 static const bool P_is_vec = true;
Chris@49 282
Chris@49 283 const subview_row<eT>& P;
Chris@49 284 const uword n_elem;
Chris@49 285 };
Chris@49 286
Chris@49 287
Chris@49 288
Chris@49 289 template<typename eT>
Chris@49 290 class diagmat_proxy< subview_col<eT> >
Chris@49 291 {
Chris@49 292 public:
Chris@49 293
Chris@49 294 typedef eT elem_type;
Chris@49 295 typedef typename get_pod_type<elem_type>::result pod_type;
Chris@49 296
Chris@49 297
Chris@49 298 inline
Chris@49 299 diagmat_proxy(const subview_col<eT>& X)
Chris@49 300 : P(X)
Chris@49 301 , n_elem(X.n_elem)
Chris@49 302 {
Chris@49 303 arma_extra_debug_sigprint();
Chris@49 304 }
Chris@49 305
Chris@49 306 arma_inline elem_type operator[] (const uword i) const { return P[i]; }
Chris@49 307 arma_inline elem_type at (const uword row, const uword col) const { return (row == col) ? P[row] : elem_type(0); }
Chris@49 308
Chris@49 309 static const bool P_is_vec = true;
Chris@49 310
Chris@49 311 const subview_col<eT>& P;
Chris@49 312 const uword n_elem;
Chris@49 313 };
Chris@49 314
Chris@49 315
Chris@49 316
Chris@49 317 //
Chris@49 318 //
Chris@49 319 //
Chris@49 320
Chris@49 321
Chris@49 322
Chris@49 323 template<typename T1>
Chris@49 324 class diagmat_proxy_check_default
Chris@49 325 {
Chris@49 326 public:
Chris@49 327
Chris@49 328 typedef typename T1::elem_type elem_type;
Chris@49 329 typedef typename get_pod_type<elem_type>::result pod_type;
Chris@49 330
Chris@49 331 inline
Chris@49 332 diagmat_proxy_check_default(const T1& X, const Mat<typename T1::elem_type>&)
Chris@49 333 : P(X)
Chris@49 334 , P_is_vec( (resolves_to_vector<T1>::value) || (P.n_rows == 1) || (P.n_cols == 1) )
Chris@49 335 , n_elem( P_is_vec ? P.n_elem : (std::min)(P.n_elem, P.n_rows) )
Chris@49 336 {
Chris@49 337 arma_extra_debug_sigprint();
Chris@49 338
Chris@49 339 arma_debug_check
Chris@49 340 (
Chris@49 341 (P_is_vec == false) && (P.n_rows != P.n_cols),
Chris@49 342 "diagmat(): only vectors and square matrices are accepted"
Chris@49 343 );
Chris@49 344 }
Chris@49 345
Chris@49 346 arma_inline elem_type operator[] (const uword i) const { return P_is_vec ? P[i] : P.at(i,i); }
Chris@49 347 arma_inline elem_type at (const uword row, const uword col) const { return (row == col) ? ( P_is_vec ? P[row] : P.at(row,row) ) : elem_type(0); }
Chris@49 348
Chris@49 349 const Mat<elem_type> P;
Chris@49 350 const bool P_is_vec;
Chris@49 351 const uword n_elem;
Chris@49 352 };
Chris@49 353
Chris@49 354
Chris@49 355
Chris@49 356 template<typename T1>
Chris@49 357 class diagmat_proxy_check_fixed
Chris@49 358 {
Chris@49 359 public:
Chris@49 360
Chris@49 361 typedef typename T1::elem_type eT;
Chris@49 362 typedef typename T1::elem_type elem_type;
Chris@49 363 typedef typename get_pod_type<elem_type>::result pod_type;
Chris@49 364
Chris@49 365 inline
Chris@49 366 diagmat_proxy_check_fixed(const T1& X, const Mat<eT>& out)
Chris@49 367 : P( const_cast<eT*>(X.memptr()), T1::n_rows, T1::n_cols, (&X == &out), false )
Chris@49 368 {
Chris@49 369 arma_extra_debug_sigprint();
Chris@49 370
Chris@49 371 arma_debug_check
Chris@49 372 (
Chris@49 373 (P_is_vec == false) && (T1::n_rows != T1::n_cols),
Chris@49 374 "diagmat(): only vectors and square matrices are accepted"
Chris@49 375 );
Chris@49 376 }
Chris@49 377
Chris@49 378
Chris@49 379 arma_inline eT operator[] (const uword i) const { return P_is_vec ? P[i] : P.at(i,i); }
Chris@49 380 arma_inline eT at (const uword row, const uword col) const { return (row == col) ? ( P_is_vec ? P[row] : P.at(row,row) ) : elem_type(0); }
Chris@49 381
Chris@49 382 const Mat<eT> P; // TODO: why not just store X directly as T1& ? test with fixed size vectors and matrices
Chris@49 383
Chris@49 384 static const bool P_is_vec = (T1::n_rows == 1) || (T1::n_cols == 1);
Chris@49 385 static const uword n_elem = P_is_vec ? T1::n_elem : ( (T1::n_elem < T1::n_rows) ? T1::n_elem : T1::n_rows );
Chris@49 386 };
Chris@49 387
Chris@49 388
Chris@49 389
Chris@49 390 template<typename T1, bool condition>
Chris@49 391 struct diagmat_proxy_check_redirect {};
Chris@49 392
Chris@49 393 template<typename T1>
Chris@49 394 struct diagmat_proxy_check_redirect<T1, false> { typedef diagmat_proxy_check_default<T1> result; };
Chris@49 395
Chris@49 396 template<typename T1>
Chris@49 397 struct diagmat_proxy_check_redirect<T1, true> { typedef diagmat_proxy_check_fixed<T1> result; };
Chris@49 398
Chris@49 399
Chris@49 400 template<typename T1>
Chris@49 401 class diagmat_proxy_check : public diagmat_proxy_check_redirect<T1, is_Mat_fixed<T1>::value >::result
Chris@49 402 {
Chris@49 403 public:
Chris@49 404 inline diagmat_proxy_check(const T1& X, const Mat<typename T1::elem_type>& out)
Chris@49 405 : diagmat_proxy_check_redirect< T1, is_Mat_fixed<T1>::value >::result(X, out)
Chris@49 406 {
Chris@49 407 }
Chris@49 408 };
Chris@49 409
Chris@49 410
Chris@49 411
Chris@49 412 template<typename eT>
Chris@49 413 class diagmat_proxy_check< Mat<eT> >
Chris@49 414 {
Chris@49 415 public:
Chris@49 416
Chris@49 417 typedef eT elem_type;
Chris@49 418 typedef typename get_pod_type<elem_type>::result pod_type;
Chris@49 419
Chris@49 420
Chris@49 421 inline
Chris@49 422 diagmat_proxy_check(const Mat<eT>& X, const Mat<eT>& out)
Chris@49 423 : P_local ( (&X == &out) ? new Mat<eT>(X) : 0 )
Chris@49 424 , P ( (&X == &out) ? (*P_local) : X )
Chris@49 425 , P_is_vec( (P.n_rows == 1) || (P.n_cols == 1) )
Chris@49 426 , n_elem ( P_is_vec ? P.n_elem : (std::min)(P.n_elem, P.n_rows) )
Chris@49 427 {
Chris@49 428 arma_extra_debug_sigprint();
Chris@49 429
Chris@49 430 arma_debug_check
Chris@49 431 (
Chris@49 432 (P_is_vec == false) && (P.n_rows != P.n_cols),
Chris@49 433 "diagmat(): only vectors and square matrices are accepted"
Chris@49 434 );
Chris@49 435 }
Chris@49 436
Chris@49 437 inline ~diagmat_proxy_check()
Chris@49 438 {
Chris@49 439 if(P_local) { delete P_local; }
Chris@49 440 }
Chris@49 441
Chris@49 442 arma_inline elem_type operator[] (const uword i) const { return P_is_vec ? P[i] : P.at(i,i); }
Chris@49 443 arma_inline elem_type at (const uword row, const uword col) const { return (row == col) ? ( P_is_vec ? P[row] : P.at(row,row) ) : elem_type(0); }
Chris@49 444
Chris@49 445 const Mat<eT>* P_local;
Chris@49 446 const Mat<eT>& P;
Chris@49 447 const bool P_is_vec;
Chris@49 448 const uword n_elem;
Chris@49 449 };
Chris@49 450
Chris@49 451
Chris@49 452
Chris@49 453 template<typename eT>
Chris@49 454 class diagmat_proxy_check< Row<eT> >
Chris@49 455 {
Chris@49 456 public:
Chris@49 457
Chris@49 458 typedef eT elem_type;
Chris@49 459 typedef typename get_pod_type<elem_type>::result pod_type;
Chris@49 460
Chris@49 461 inline
Chris@49 462 diagmat_proxy_check(const Row<eT>& X, const Mat<eT>& out)
Chris@49 463 : P_local ( (&X == reinterpret_cast<const Row<eT>*>(&out)) ? new Row<eT>(X) : 0 )
Chris@49 464 , P ( (&X == reinterpret_cast<const Row<eT>*>(&out)) ? (*P_local) : X )
Chris@49 465 , n_elem (X.n_elem)
Chris@49 466 {
Chris@49 467 arma_extra_debug_sigprint();
Chris@49 468 }
Chris@49 469
Chris@49 470 inline ~diagmat_proxy_check()
Chris@49 471 {
Chris@49 472 if(P_local) { delete P_local; }
Chris@49 473 }
Chris@49 474
Chris@49 475 arma_inline elem_type operator[] (const uword i) const { return P[i]; }
Chris@49 476 arma_inline elem_type at (const uword row, const uword col) const { return (row == col) ? P[row] : elem_type(0); }
Chris@49 477
Chris@49 478 static const bool P_is_vec = true;
Chris@49 479
Chris@49 480 const Row<eT>* P_local;
Chris@49 481 const Row<eT>& P;
Chris@49 482 const uword n_elem;
Chris@49 483 };
Chris@49 484
Chris@49 485
Chris@49 486
Chris@49 487 template<typename eT>
Chris@49 488 class diagmat_proxy_check< Col<eT> >
Chris@49 489 {
Chris@49 490 public:
Chris@49 491
Chris@49 492 typedef eT elem_type;
Chris@49 493 typedef typename get_pod_type<elem_type>::result pod_type;
Chris@49 494
Chris@49 495 inline
Chris@49 496 diagmat_proxy_check(const Col<eT>& X, const Mat<eT>& out)
Chris@49 497 : P_local ( (&X == reinterpret_cast<const Col<eT>*>(&out)) ? new Col<eT>(X) : 0 )
Chris@49 498 , P ( (&X == reinterpret_cast<const Col<eT>*>(&out)) ? (*P_local) : X )
Chris@49 499 , n_elem (X.n_elem)
Chris@49 500 {
Chris@49 501 arma_extra_debug_sigprint();
Chris@49 502 }
Chris@49 503
Chris@49 504 inline ~diagmat_proxy_check()
Chris@49 505 {
Chris@49 506 if(P_local) { delete P_local; }
Chris@49 507 }
Chris@49 508
Chris@49 509 arma_inline elem_type operator[] (const uword i) const { return P[i]; }
Chris@49 510 arma_inline elem_type at (const uword row, const uword col) const { return (row == col) ? P[row] : elem_type(0); }
Chris@49 511
Chris@49 512 static const bool P_is_vec = true;
Chris@49 513
Chris@49 514 const Col<eT>* P_local;
Chris@49 515 const Col<eT>& P;
Chris@49 516 const uword n_elem;
Chris@49 517 };
Chris@49 518
Chris@49 519
Chris@49 520
Chris@49 521 template<typename eT>
Chris@49 522 class diagmat_proxy_check< subview_row<eT> >
Chris@49 523 {
Chris@49 524 public:
Chris@49 525
Chris@49 526 typedef eT elem_type;
Chris@49 527 typedef typename get_pod_type<elem_type>::result pod_type;
Chris@49 528
Chris@49 529 inline
Chris@49 530 diagmat_proxy_check(const subview_row<eT>& X, const Mat<eT>&)
Chris@49 531 : P ( X )
Chris@49 532 , n_elem ( X.n_elem )
Chris@49 533 {
Chris@49 534 arma_extra_debug_sigprint();
Chris@49 535 }
Chris@49 536
Chris@49 537 arma_inline elem_type operator[] (const uword i) const { return P[i]; }
Chris@49 538 arma_inline elem_type at (const uword row, const uword col) const { return (row == col) ? P[row] : elem_type(0); }
Chris@49 539
Chris@49 540 static const bool P_is_vec = true;
Chris@49 541
Chris@49 542 const Row<eT> P;
Chris@49 543 const uword n_elem;
Chris@49 544 };
Chris@49 545
Chris@49 546
Chris@49 547
Chris@49 548 template<typename eT>
Chris@49 549 class diagmat_proxy_check< subview_col<eT> >
Chris@49 550 {
Chris@49 551 public:
Chris@49 552
Chris@49 553 typedef eT elem_type;
Chris@49 554 typedef typename get_pod_type<elem_type>::result pod_type;
Chris@49 555
Chris@49 556 inline
Chris@49 557 diagmat_proxy_check(const subview_col<eT>& X, const Mat<eT>& out)
Chris@49 558 : P ( const_cast<eT*>(X.colptr(0)), X.n_rows, (&(X.m) == &out), false )
Chris@49 559 , n_elem( X.n_elem )
Chris@49 560 //, X_ref ( X )
Chris@49 561 {
Chris@49 562 arma_extra_debug_sigprint();
Chris@49 563 }
Chris@49 564
Chris@49 565 arma_inline elem_type operator[] (const uword i) const { return P[i]; }
Chris@49 566 arma_inline elem_type at (const uword row, const uword col) const { return (row == col) ? P[row] : elem_type(0); }
Chris@49 567
Chris@49 568 static const bool P_is_vec = true;
Chris@49 569
Chris@49 570 const Col<eT> P;
Chris@49 571 const uword n_elem;
Chris@49 572
Chris@49 573 //const subview_col<eT>& X_ref; // prevents the compiler from potentially deleting X before we're done with it
Chris@49 574 };
Chris@49 575
Chris@49 576
Chris@49 577
Chris@49 578 //! @}