00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00016
00017
00018
00019 template<typename T1>
00020 class diagmat_proxy
00021 {
00022 public:
00023
00024 typedef typename T1::elem_type elem_type;
00025 typedef typename get_pod_type<elem_type>::result pod_type;
00026
00027 inline diagmat_proxy(const Base<typename T1::elem_type,T1>& X)
00028 : P ( X.get_ref() )
00029 , P_is_vec( (P.get_n_rows() == 1) || (P.get_n_cols() == 1) )
00030 , n_elem ( P_is_vec ? P.get_n_elem() : (std::min)(P.get_n_elem(), P.get_n_rows()) )
00031 {
00032 arma_extra_debug_sigprint();
00033
00034 arma_debug_check
00035 (
00036 (P_is_vec == false) && (P.get_n_rows() != P.get_n_cols()),
00037 "diagmat(): only vectors and square matrices are accepted"
00038 );
00039 }
00040
00041
00042 arma_inline
00043 elem_type
00044 operator[](const uword i) const
00045 {
00046 if( (Proxy<T1>::prefer_at_accessor == true) || (P_is_vec == false) )
00047 {
00048 return P.at(i,i);
00049 }
00050 else
00051 {
00052 return P[i];
00053 }
00054 }
00055
00056
00057 arma_inline
00058 elem_type
00059 at(const uword row, const uword col) const
00060 {
00061 if(row == col)
00062 {
00063 if( (Proxy<T1>::prefer_at_accessor == true) || (P_is_vec == false) )
00064 {
00065 return P.at(row,row);
00066 }
00067 else
00068 {
00069 return P[row];
00070 }
00071 }
00072 else
00073 {
00074 return elem_type(0);
00075 }
00076 }
00077
00078
00079 const Proxy<T1> P;
00080 const bool P_is_vec;
00081 const uword n_elem;
00082 };
00083
00084
00085
00086 template<typename eT>
00087 class diagmat_proxy< Mat<eT> >
00088 {
00089 public:
00090
00091 typedef eT elem_type;
00092 typedef typename get_pod_type<elem_type>::result pod_type;
00093
00094
00095 inline diagmat_proxy(const Mat<eT>& X)
00096 : P(X)
00097 , P_is_vec( (P.n_rows == 1) || (P.n_cols == 1) )
00098 , n_elem( P_is_vec ? P.n_elem : (std::min)(P.n_elem, P.n_rows) )
00099 {
00100 arma_extra_debug_sigprint();
00101
00102 arma_debug_check
00103 (
00104 (P_is_vec == false) && (P.n_rows != P.n_cols),
00105 "diagmat(): only vectors and square matrices are accepted"
00106 );
00107 }
00108
00109
00110 arma_inline elem_type operator[] (const uword i) const { return P_is_vec ? P[i] : P.at(i,i); }
00111 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); }
00112
00113 const Mat<eT>& P;
00114 const bool P_is_vec;
00115 const uword n_elem;
00116 };
00117
00118
00119
00120 template<typename eT>
00121 class diagmat_proxy< Row<eT> >
00122 {
00123 public:
00124
00125 typedef eT elem_type;
00126 typedef typename get_pod_type<elem_type>::result pod_type;
00127
00128
00129 inline diagmat_proxy(const Row<eT>& X)
00130 : P(X)
00131 , P_is_vec(true)
00132 , n_elem(P.n_elem)
00133 {
00134 arma_extra_debug_sigprint();
00135 }
00136
00137
00138 arma_inline elem_type operator[] (const uword i) const { return P[i]; }
00139 arma_inline elem_type at (const uword row, const uword col) const { return (row == col) ? P[row] : elem_type(0); }
00140
00141
00142 const Row<eT>& P;
00143 const bool P_is_vec;
00144 const uword n_elem;
00145 };
00146
00147
00148
00149 template<typename eT>
00150 class diagmat_proxy< Col<eT> >
00151 {
00152 public:
00153
00154 typedef eT elem_type;
00155 typedef typename get_pod_type<elem_type>::result pod_type;
00156
00157
00158 inline diagmat_proxy(const Col<eT>& X)
00159 : P(X)
00160 , P_is_vec(true)
00161 , n_elem(P.n_elem)
00162 {
00163 arma_extra_debug_sigprint();
00164 }
00165
00166
00167 arma_inline elem_type operator[] (const uword i) const { return P[i]; }
00168 arma_inline elem_type at (const uword row, const uword col) const { return (row == col) ? P[row] : elem_type(0); }
00169
00170
00171 const Col<eT>& P;
00172 const bool P_is_vec;
00173 const uword n_elem;
00174 };
00175
00176
00177
00178 template<typename T1>
00179 class diagmat_proxy_check
00180 {
00181 public:
00182
00183 typedef typename T1::elem_type elem_type;
00184 typedef typename get_pod_type<elem_type>::result pod_type;
00185
00186 inline diagmat_proxy_check(const Base<typename T1::elem_type,T1>& X, const Mat<typename T1::elem_type>& out)
00187 : P(X.get_ref())
00188 , P_is_vec( (P.n_rows == 1) || (P.n_cols == 1) )
00189 , n_elem( P_is_vec ? P.n_elem : (std::min)(P.n_elem, P.n_rows) )
00190 {
00191 arma_extra_debug_sigprint();
00192 arma_ignore(out);
00193
00194 arma_debug_check
00195 (
00196 (P_is_vec == false) && (P.n_rows != P.n_cols),
00197 "diagmat(): only vectors and square matrices are accepted"
00198 );
00199 }
00200
00201
00202 arma_inline elem_type operator[] (const uword i) const { return P_is_vec ? P[i] : P.at(i,i); }
00203 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); }
00204
00205
00206 const Mat<elem_type> P;
00207 const bool P_is_vec;
00208 const uword n_elem;
00209 };
00210
00211
00212
00213 template<typename eT>
00214 class diagmat_proxy_check< Mat<eT> >
00215 {
00216 public:
00217
00218 typedef eT elem_type;
00219 typedef typename get_pod_type<elem_type>::result pod_type;
00220
00221
00222 inline diagmat_proxy_check(const Mat<eT>& X, const Mat<eT>& out)
00223 : P_local ( (&X == &out) ? new Mat<eT>(X) : 0 )
00224 , P ( (&X == &out) ? (*P_local) : X )
00225 , P_is_vec( (P.n_rows == 1) || (P.n_cols == 1) )
00226 , n_elem ( P_is_vec ? P.n_elem : (std::min)(P.n_elem, P.n_rows) )
00227 {
00228 arma_extra_debug_sigprint();
00229
00230 arma_debug_check
00231 (
00232 (P_is_vec == false) && (P.n_rows != P.n_cols),
00233 "diagmat(): only vectors and square matrices are accepted"
00234 );
00235 }
00236
00237 inline ~diagmat_proxy_check()
00238 {
00239 if(P_local)
00240 {
00241 delete P_local;
00242 }
00243 }
00244
00245
00246 arma_inline elem_type operator[] (const uword i) const { return P_is_vec ? P[i] : P.at(i,i); }
00247 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); }
00248
00249
00250 const Mat<eT>* P_local;
00251 const Mat<eT>& P;
00252 const bool P_is_vec;
00253 const uword n_elem;
00254 };
00255
00256
00257
00258 template<typename eT>
00259 class diagmat_proxy_check< Row<eT> >
00260 {
00261 public:
00262
00263 typedef eT elem_type;
00264 typedef typename get_pod_type<elem_type>::result pod_type;
00265
00266 inline diagmat_proxy_check(const Row<eT>& X, const Mat<eT>& out)
00267 : P_local ( (&X == reinterpret_cast<const Row<eT>*>(&out)) ? new Row<eT>(X) : 0 )
00268 , P ( (&X == reinterpret_cast<const Row<eT>*>(&out)) ? (*P_local) : X )
00269 , P_is_vec(true)
00270 , n_elem (P.n_elem)
00271 {
00272 arma_extra_debug_sigprint();
00273 }
00274
00275
00276 inline ~diagmat_proxy_check()
00277 {
00278 if(P_local)
00279 {
00280 delete P_local;
00281 }
00282 }
00283
00284
00285 arma_inline elem_type operator[] (const uword i) const { return P[i]; }
00286 arma_inline elem_type at (const uword row, const uword col) const { return (row == col) ? P[row] : elem_type(0); }
00287
00288
00289 const Row<eT>* P_local;
00290 const Row<eT>& P;
00291 const bool P_is_vec;
00292 const uword n_elem;
00293 };
00294
00295
00296
00297
00298
00299
00300 template<typename eT>
00301 class diagmat_proxy_check< Col<eT> >
00302 {
00303 public:
00304
00305 typedef eT elem_type;
00306 typedef typename get_pod_type<elem_type>::result pod_type;
00307
00308 inline diagmat_proxy_check(const Col<eT>& X, const Mat<eT>& out)
00309 : P_local ( (&X == reinterpret_cast<const Col<eT>*>(&out)) ? new Col<eT>(X) : 0 )
00310 , P ( (&X == reinterpret_cast<const Col<eT>*>(&out)) ? (*P_local) : X )
00311 , P_is_vec(true)
00312 , n_elem (P.n_elem)
00313 {
00314 arma_extra_debug_sigprint();
00315 }
00316
00317
00318 inline ~diagmat_proxy_check()
00319 {
00320 if(P_local)
00321 {
00322 delete P_local;
00323 }
00324 }
00325
00326
00327 arma_inline elem_type operator[] (const uword i) const { return P[i]; }
00328 arma_inline elem_type at (const uword row, const uword col) const { return (row == col) ? P[row] : elem_type(0); }
00329
00330
00331 const Col<eT>* P_local;
00332 const Col<eT>& P;
00333 const bool P_is_vec;
00334 const uword n_elem;
00335 };
00336
00337
00338