op_trans_meat.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 template<typename eT>
00022 inline
00023 void
00024 op_trans::apply_noalias(Mat<eT>& out, const Mat<eT>& A)
00025 {
00026 arma_extra_debug_sigprint();
00027
00028 const u32 A_n_cols = A.n_cols;
00029 const u32 A_n_rows = A.n_rows;
00030
00031
00032 out.set_size(A_n_cols, A_n_rows);
00033
00034 if( (A_n_cols == 1) || (A_n_rows == 1) )
00035 {
00036 syslib::copy_elem( out.memptr(), A.mem, A.n_elem );
00037 }
00038 else
00039 {
00040 for(u32 in_row = 0; in_row<A_n_rows; ++in_row)
00041 {
00042 const u32 out_col = in_row;
00043
00044 for(u32 in_col = 0; in_col<A_n_cols; ++in_col)
00045 {
00046 const u32 out_row = in_col;
00047 out.at(out_row, out_col) = A.at(in_row, in_col);
00048 }
00049 }
00050 }
00051
00052 }
00053
00054
00055
00056 template<typename eT>
00057 inline
00058 void
00059 op_trans::apply(Mat<eT>& out, const Mat<eT>& A)
00060 {
00061 arma_extra_debug_sigprint();
00062
00063 if(&out != &A)
00064 {
00065 op_trans::apply_noalias(out, A);
00066 }
00067 else
00068 {
00069 if(out.n_rows == out.n_cols)
00070 {
00071 arma_extra_debug_print("op_trans::apply(): doing in-place transpose of a square matrix");
00072
00073 const u32 n_rows = out.n_rows;
00074 const u32 n_cols = out.n_cols;
00075
00076 for(u32 col=0; col<n_cols; ++col)
00077 {
00078 eT* coldata = out.colptr(col);
00079
00080 for(u32 row=(col+1); row<n_rows; ++row)
00081 {
00082 std::swap( out.at(col,row), coldata[row] );
00083 }
00084 }
00085 }
00086 else
00087 {
00088 const Mat<eT> A_copy = A;
00089 op_trans::apply_noalias(out, A_copy);
00090 }
00091 }
00092 }
00093
00094
00095
00096 template<typename T1>
00097 inline
00098 void
00099 op_trans::apply(Mat<typename T1::elem_type>& out, const Op<T1,op_trans>& in)
00100 {
00101 arma_extra_debug_sigprint();
00102
00103 typedef typename T1::elem_type eT;
00104
00105 const unwrap<T1> tmp(in.m);
00106 const Mat<eT>& A = tmp.M;
00107
00108 if(&out != &A)
00109 {
00110 op_trans::apply_noalias(out, A);
00111 }
00112 else
00113 {
00114 if(out.n_rows == out.n_cols)
00115 {
00116 arma_extra_debug_print("op_trans::apply(): doing in-place transpose of a square matrix");
00117
00118 const u32 n_rows = out.n_rows;
00119 const u32 n_cols = out.n_cols;
00120
00121 for(u32 col=0; col<n_cols; ++col)
00122 {
00123 eT* coldata = out.colptr(col);
00124
00125 for(u32 row=(col+1); row<n_rows; ++row)
00126 {
00127 std::swap( out.at(col,row), coldata[row] );
00128 }
00129 }
00130 }
00131 else
00132 {
00133 const Mat<eT> A_copy = A;
00134 op_trans::apply_noalias(out, A_copy);
00135 }
00136 }
00137
00138 }
00139
00140
00141
00142 #if defined(ARMA_GOOD_COMPILER)
00143
00144
00145
00146 template<typename T1, typename T2>
00147 inline
00148 void
00149 op_trans::apply(Mat<typename T1::elem_type>& out, const Op< Glue<T1,T2,glue_plus>, op_trans>& in)
00150 {
00151 arma_extra_debug_sigprint();
00152
00153 typedef typename T1::elem_type eT;
00154
00155 isnt_same_type<eT, typename T2::elem_type>::check();
00156
00157 const unwrap_check<T1> tmp1(in.m.A, out);
00158 const unwrap_check<T2> tmp2(in.m.B, out);
00159
00160 const Mat<eT>& A = tmp1.M;
00161 const Mat<eT>& B = tmp2.M;
00162
00163 arma_debug_assert_same_size(A, B, "matrix addition");
00164
00165 out.set_size(A.n_cols, A.n_rows);
00166
00167 if( ( (A.n_rows == 1) || (A.n_cols == 1) ) && ( (B.n_rows == 1) || (B.n_cols == 1) ) )
00168 {
00169 for(u32 i=0; i<A.n_elem; ++i)
00170 {
00171 out[i] = A[i] + B[i];
00172 }
00173 }
00174 else
00175 {
00176 const u32 A_n_cols = A.n_cols;
00177 const u32 A_n_rows = A.n_rows;
00178
00179 for(u32 col=0; col<A_n_cols; ++col)
00180 {
00181 const u32 out_row = col;
00182 for(u32 row=0; row<A_n_rows; ++row)
00183 {
00184 const u32 out_col = row;
00185 out.at(out_row, out_col) = A.at(row,col) + B.at(row,col);
00186 }
00187
00188 }
00189
00190 }
00191
00192 }
00193
00194
00195
00196 #endif
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230
00231
00232
00233
00234
00235
00236
00237
00238
00239
00240
00241