op_diagmat_meat.hpp
Go to the documentation of this file.
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 
16 
17 
18 
19 template<typename T1>
20 inline
21 void
23  {
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 
arma_inline arma_warn_unused bool is_vec() const
returns true if the object can be interpreted as a column or row vector
Definition: Mat_meat.hpp:3824
arma_inline arma_warn_unused eT * memptr()
returns a pointer to array of eTs used by the matrix
Definition: Mat_meat.hpp:4024
A lightweight array for POD types. If the amount of memory requested is small, the stack is used...
const uword n_elem
number of elements in the matrix (read-only)
Definition: Mat_bones.hpp:31
const uword n_rows
number of rows in the matrix (read-only)
Definition: Mat_bones.hpp:29
arma_aligned const T1 & m
storage of reference to the operand (eg. a matrix)
Definition: Op_bones.hpp:45
arma_inline arma_warn_unused eT * colptr(const uword in_col)
returns a pointer to array of eTs for a specified column; no bounds check
Definition: Mat_meat.hpp:4000
u32 uword
Definition: typedef.hpp:85
#define arma_debug_check
Definition: debug.hpp:1084
const Mat< eT > M
Definition: unwrap.hpp:32
static arma_hot void inplace_set(eT *dest, const eT val, const uword n_elem)
arma_inline arma_warn_unused eT & at(const uword i)
linear element accessor (treats the matrix as a vector); no bounds check.
Definition: Mat_meat.hpp:3692
arma_inline arma_warn_unused bool is_square() const
returns true if the object has the same number of non-zero rows and columnns
Definition: Mat_meat.hpp:3860
#define arma_extra_debug_sigprint
Definition: debug.hpp:1116
static void apply(Mat< typename T1::elem_type > &out, const Op< T1, op_diagmat > &X)
arma_inline eT * memptr()
Dense matrix class.
const Mat & zeros()
Definition: Mat_meat.hpp:4331


armadillo_matrix
Author(s):
autogenerated on Fri Apr 16 2021 02:31:58