comparison armadillo-2.4.4/include/armadillo_bits/op_diagmat_meat.hpp @ 0:8b6102e2a9b0

Armadillo Library
author maxzanoni76 <max.zanoni@eecs.qmul.ac.uk>
date Wed, 11 Apr 2012 09:27:06 +0100
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:8b6102e2a9b0
1 // Copyright (C) 2008-2011 NICTA (www.nicta.com.au)
2 // Copyright (C) 2008-2011 Conrad Sanderson
3 //
4 // This file is part of the Armadillo C++ library.
5 // It is provided without any warranty of fitness
6 // for any purpose. You can redistribute this file
7 // and/or modify it under the terms of the GNU
8 // Lesser General Public License (LGPL) as published
9 // by the Free Software Foundation, either version 3
10 // of the License or (at your option) any later version.
11 // (see http://www.opensource.org/licenses for more info)
12
13
14 //! \addtogroup op_diagmat
15 //! @{
16
17
18
19 template<typename T1>
20 inline
21 void
22 op_diagmat::apply(Mat<typename T1::elem_type>& out, const Op<T1, op_diagmat>& X)
23 {
24 arma_extra_debug_sigprint();
25
26 typedef typename T1::elem_type eT;
27
28 const unwrap<T1> tmp(X.m);
29 const Mat<eT>& A = tmp.M;
30
31 if(A.is_vec() == true)
32 {
33 // generate a diagonal matrix out of a vector
34
35 const uword N = A.n_elem;
36 const eT* A_mem = A.memptr();
37
38 if(&out != &A)
39 {
40 // no aliasing
41 out.zeros(N,N);
42
43 for(uword i=0; i<N; ++i)
44 {
45 out.at(i,i) = A_mem[i];
46 }
47 }
48 else
49 {
50 // aliasing
51
52 const podarray<eT> tmp(A_mem, N);
53
54 const eT* tmp_mem = tmp.memptr();
55
56 out.zeros(N,N);
57
58 for(uword i=0; i<N; ++i)
59 {
60 out.at(i,i) = tmp_mem[i];
61 }
62 }
63 }
64 else
65 {
66 // generate a diagonal matrix out of a matrix
67
68 arma_debug_check( (A.is_square() == false), "diagmat(): given matrix is not square" );
69
70 const uword N = A.n_rows;
71
72 if(&out != &A)
73 {
74 // no aliasing
75
76 out.zeros(N,N);
77
78 for(uword i=0; i<N; ++i)
79 {
80 out.at(i,i) = A.at(i,i);
81 }
82 }
83 else
84 {
85 // aliasing
86
87 for(uword i=0; i<N; ++i)
88 {
89 eT* colptr = out.colptr(i);
90
91 // clear above the diagonal
92 arrayops::inplace_set(colptr, eT(0), i);
93
94 // clear below the diagonal
95 arrayops::inplace_set(colptr+(i+1), eT(0), N-1-i);
96 }
97 }
98 }
99 }
100
101
102
103 //! @}