fn_accu.hpp
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 template<typename T1>
00023 arma_hot
00024 inline
00025 typename T1::elem_type
00026 accu_unwrap(const Base<typename T1::elem_type,T1>& X)
00027 {
00028 arma_extra_debug_sigprint();
00029
00030 typedef typename T1::elem_type eT;
00031
00032 const unwrap<T1> tmp(X.get_ref());
00033 const Mat<eT>& A = tmp.M;
00034
00035 const eT* A_mem = A.memptr();
00036 const u32 N = A.n_elem;
00037
00038 eT val1 = eT(0);
00039 eT val2 = eT(0);
00040
00041 u32 i,j;
00042
00043 for(i=0, j=1; j<N; i+=2, j+=2)
00044 {
00045 val1 += A_mem[i];
00046 val2 += A_mem[j];
00047 }
00048
00049 if(i < N)
00050 {
00051 val1 += A_mem[i];
00052 }
00053
00054 return val1 + val2;
00055 }
00056
00057
00058
00059 template<typename T1>
00060 arma_hot
00061 inline
00062 typename T1::elem_type
00063 accu_proxy(const Base<typename T1::elem_type,T1>& X)
00064 {
00065 arma_extra_debug_sigprint();
00066
00067 typedef typename T1::elem_type eT;
00068
00069 const Proxy<T1> A(X.get_ref());
00070
00071 const u32 N = A.n_elem;
00072
00073 eT val = eT(0);
00074
00075 for(u32 i=0; i<N; ++i)
00076 {
00077 val += A[i];
00078 }
00079
00080 return val;
00081 }
00082
00083
00084
00085
00086 template<typename T1>
00087 arma_inline
00088 arma_warn_unused
00089 typename T1::elem_type
00090 accu(const Base<typename T1::elem_type,T1>& X)
00091 {
00092 arma_extra_debug_sigprint();
00093
00094 return (is_Mat<T1>::value == true) ? accu_unwrap(X) : accu_proxy(X);
00095 }
00096
00097
00098
00099
00100 template<typename T1>
00101 arma_hot
00102 arma_warn_unused
00103 inline
00104 typename T1::elem_type
00105 accu(const BaseCube<typename T1::elem_type,T1>& X)
00106 {
00107 arma_extra_debug_sigprint();
00108
00109 typedef typename T1::elem_type eT;
00110
00111 const ProxyCube<T1> A(X.get_ref());
00112
00113 const u32 n_elem = A.n_elem;
00114
00115 eT val = eT(0);
00116
00117 for(u32 i=0; i<n_elem; ++i)
00118 {
00119 val += A[i];
00120 }
00121
00122 return val;
00123 }
00124
00125
00126
00127
00128 template<typename eT>
00129 arma_pure
00130 arma_warn_unused
00131 inline
00132 eT
00133 accu(const diagview<eT>& X)
00134 {
00135 arma_extra_debug_sigprint();
00136
00137 const u32 n_elem = X.n_elem;
00138 eT val = eT(0);
00139
00140 for(u32 i=0; i<n_elem; ++i)
00141 {
00142 val += X[i];
00143 }
00144
00145 return val;
00146 }
00147
00148
00149
00150
00151 template<typename eT>
00152 arma_pure
00153 arma_warn_unused
00154 inline
00155 eT
00156 accu(const subview<eT>& S)
00157 {
00158 arma_extra_debug_sigprint();
00159
00160 eT val = eT(0);
00161
00162 for(u32 col=0; col<S.n_cols; ++col)
00163 {
00164 const eT* coldata = S.colptr(col);
00165
00166 for(u32 row=0; row<S.n_rows; ++row)
00167 {
00168 val += coldata[row];
00169 }
00170
00171 }
00172
00173 return val;
00174 }
00175
00176
00177
00178
00179 template<typename eT>
00180 arma_pure
00181 arma_warn_unused
00182 inline
00183 eT
00184 accu(const subview_row<eT>& S)
00185 {
00186 arma_extra_debug_sigprint();
00187
00188 const Mat<eT>& X = S.m;
00189
00190 const u32 row = S.aux_row1;
00191 const u32 start_col = S.aux_col1;
00192 const u32 end_col = S.aux_col2;
00193
00194 eT val = eT(0);
00195
00196 for(u32 col=start_col; col<=end_col; ++col)
00197 {
00198 val += X.at(row,col);
00199 }
00200
00201 return val;
00202 }
00203
00204
00205
00206
00207 template<typename eT>
00208 arma_pure
00209 arma_warn_unused
00210 inline
00211 eT
00212 accu(const subview_col<eT>& S)
00213 {
00214 arma_extra_debug_sigprint();
00215
00216 const eT* S_colptr = S.colptr(0);
00217 const u32 n_rows = S.n_rows;
00218
00219 eT val = eT(0);
00220
00221 for(u32 row=0; row<n_rows; ++row)
00222 {
00223 val += S_colptr[row];
00224 }
00225
00226 return val;
00227 }
00228
00229
00230
00231