annotate armadillo-2.4.4/include/armadillo_bits/op_symmat_meat.hpp @ 18:8d046a9d36aa slimline

Back out rev 13:ac07c60aa798. Like an idiot, I committed a whole pile of unrelated changes in the guise of a single typo fix. Will re-commit in stages
author Chris Cannam
date Thu, 10 May 2012 10:45:44 +0100
parents 8b6102e2a9b0
children
rev   line source
max@0 1 // Copyright (C) 2011 NICTA (www.nicta.com.au)
max@0 2 // Copyright (C) 2011 Conrad Sanderson
max@0 3 //
max@0 4 // This file is part of the Armadillo C++ library.
max@0 5 // It is provided without any warranty of fitness
max@0 6 // for any purpose. You can redistribute this file
max@0 7 // and/or modify it under the terms of the GNU
max@0 8 // Lesser General Public License (LGPL) as published
max@0 9 // by the Free Software Foundation, either version 3
max@0 10 // of the License or (at your option) any later version.
max@0 11 // (see http://www.opensource.org/licenses for more info)
max@0 12
max@0 13
max@0 14 //! \addtogroup op_symmat
max@0 15 //! @{
max@0 16
max@0 17
max@0 18
max@0 19 template<typename T1>
max@0 20 inline
max@0 21 void
max@0 22 op_symmat::apply
max@0 23 (
max@0 24 Mat<typename T1::elem_type>& out,
max@0 25 const Op<T1,op_symmat>& in,
max@0 26 const typename arma_not_cx<typename T1::elem_type>::result* junk
max@0 27 )
max@0 28 {
max@0 29 arma_extra_debug_sigprint();
max@0 30 arma_ignore(junk);
max@0 31
max@0 32 typedef typename T1::elem_type eT;
max@0 33
max@0 34 const unwrap<T1> tmp(in.m);
max@0 35 const Mat<eT>& A = tmp.M;
max@0 36
max@0 37 arma_debug_check( (A.is_square() == false), "symmatu()/symmatl(): given matrix must be square" );
max@0 38
max@0 39 const uword N = A.n_rows;
max@0 40 const bool upper = (in.aux_uword_a == 0);
max@0 41
max@0 42 if(&out != &A)
max@0 43 {
max@0 44 out.copy_size(A);
max@0 45
max@0 46 if(upper)
max@0 47 {
max@0 48 // upper triangular: copy the diagonal and the elements above the diagonal
max@0 49
max@0 50 for(uword i=0; i<N; ++i)
max@0 51 {
max@0 52 const eT* A_data = A.colptr(i);
max@0 53 eT* out_data = out.colptr(i);
max@0 54
max@0 55 arrayops::copy( out_data, A_data, i+1 );
max@0 56 }
max@0 57 }
max@0 58 else
max@0 59 {
max@0 60 // lower triangular: copy the diagonal and the elements below the diagonal
max@0 61
max@0 62 for(uword i=0; i<N; ++i)
max@0 63 {
max@0 64 const eT* A_data = A.colptr(i);
max@0 65 eT* out_data = out.colptr(i);
max@0 66
max@0 67 arrayops::copy( &out_data[i], &A_data[i], N-i );
max@0 68 }
max@0 69 }
max@0 70 }
max@0 71
max@0 72
max@0 73 if(upper)
max@0 74 {
max@0 75 // reflect elements across the diagonal from upper triangle to lower triangle
max@0 76
max@0 77 for(uword col=1; col < N; ++col)
max@0 78 {
max@0 79 const eT* coldata = out.colptr(col);
max@0 80
max@0 81 for(uword row=0; row < col; ++row)
max@0 82 {
max@0 83 out.at(col,row) = coldata[row];
max@0 84 }
max@0 85 }
max@0 86 }
max@0 87 else
max@0 88 {
max@0 89 // reflect elements across the diagonal from lower triangle to upper triangle
max@0 90
max@0 91 for(uword col=0; col < N; ++col)
max@0 92 {
max@0 93 const eT* coldata = out.colptr(col);
max@0 94
max@0 95 for(uword row=(col+1); row < N; ++row)
max@0 96 {
max@0 97 out.at(col,row) = coldata[row];
max@0 98 }
max@0 99 }
max@0 100 }
max@0 101 }
max@0 102
max@0 103
max@0 104
max@0 105 template<typename T1>
max@0 106 inline
max@0 107 void
max@0 108 op_symmat::apply
max@0 109 (
max@0 110 Mat<typename T1::elem_type>& out,
max@0 111 const Op<T1,op_symmat>& in,
max@0 112 const typename arma_cx_only<typename T1::elem_type>::result* junk
max@0 113 )
max@0 114 {
max@0 115 arma_extra_debug_sigprint();
max@0 116 arma_ignore(junk);
max@0 117
max@0 118 typedef typename T1::elem_type eT;
max@0 119
max@0 120 const unwrap<T1> tmp(in.m);
max@0 121 const Mat<eT>& A = tmp.M;
max@0 122
max@0 123 arma_debug_check( (A.is_square() == false), "symmatu()/symmatl(): given matrix must be square" );
max@0 124
max@0 125 const uword N = A.n_rows;
max@0 126 const bool upper = (in.aux_uword_a == 0);
max@0 127
max@0 128 if(&out != &A)
max@0 129 {
max@0 130 out.copy_size(A);
max@0 131
max@0 132 if(upper)
max@0 133 {
max@0 134 // upper triangular: copy the diagonal and the elements above the diagonal
max@0 135
max@0 136 for(uword i=0; i<N; ++i)
max@0 137 {
max@0 138 const eT* A_data = A.colptr(i);
max@0 139 eT* out_data = out.colptr(i);
max@0 140
max@0 141 arrayops::copy( out_data, A_data, i+1 );
max@0 142 }
max@0 143 }
max@0 144 else
max@0 145 {
max@0 146 // lower triangular: copy the diagonal and the elements below the diagonal
max@0 147
max@0 148 for(uword i=0; i<N; ++i)
max@0 149 {
max@0 150 const eT* A_data = A.colptr(i);
max@0 151 eT* out_data = out.colptr(i);
max@0 152
max@0 153 arrayops::copy( &out_data[i], &A_data[i], N-i );
max@0 154 }
max@0 155 }
max@0 156 }
max@0 157
max@0 158
max@0 159 if(upper)
max@0 160 {
max@0 161 // reflect elements across the diagonal from upper triangle to lower triangle
max@0 162
max@0 163 for(uword col=1; col < N; ++col)
max@0 164 {
max@0 165 const eT* coldata = out.colptr(col);
max@0 166
max@0 167 for(uword row=0; row < col; ++row)
max@0 168 {
max@0 169 out.at(col,row) = std::conj(coldata[row]);
max@0 170 }
max@0 171 }
max@0 172 }
max@0 173 else
max@0 174 {
max@0 175 // reflect elements across the diagonal from lower triangle to upper triangle
max@0 176
max@0 177 for(uword col=0; col < N; ++col)
max@0 178 {
max@0 179 const eT* coldata = out.colptr(col);
max@0 180
max@0 181 for(uword row=(col+1); row < N; ++row)
max@0 182 {
max@0 183 out.at(col,row) = std::conj(coldata[row]);
max@0 184 }
max@0 185 }
max@0 186 }
max@0 187 }
max@0 188
max@0 189
max@0 190
max@0 191 //! @}