op_shuffle_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
00022
00023
00024 template<typename T1>
00025 inline
00026 void
00027 op_shuffle::apply(Mat<typename T1::elem_type>& out, const Op<T1,op_shuffle>& in)
00028 {
00029 arma_extra_debug_sigprint();
00030
00031 typedef typename T1::elem_type eT;
00032
00033 const unwrap<T1> tmp(in.m);
00034 const Mat<eT>& X = tmp.M;
00035
00036 const u32 dim = in.aux_u32_a;
00037 const u32 N = (dim == 0) ? X.n_rows : X.n_cols;
00038
00039
00040
00041 std::vector< arma_sort_index_packet_ascend<int,u32> > packet_vec(N);
00042
00043 for(u32 i=0; i<N; ++i)
00044 {
00045 packet_vec[i].val = std::rand();
00046 packet_vec[i].index = i;
00047 }
00048
00049 std::sort( packet_vec.begin(), packet_vec.end() );
00050
00051 if(X.is_vec() == false)
00052 {
00053 if(&out != &X)
00054 {
00055 arma_extra_debug_print("op_shuffle::apply(): matrix");
00056
00057 out.copy_size(X);
00058
00059 if(dim == 0)
00060 {
00061 for(u32 i=0; i<N; ++i)
00062 {
00063 out.row(i) = X.row(packet_vec[i].index);
00064 }
00065 }
00066 else
00067 {
00068 for(u32 i=0; i<N; ++i)
00069 {
00070 out.col(i) = X.col(packet_vec[i].index);
00071 }
00072 }
00073 }
00074 else
00075 {
00076 arma_extra_debug_print("op_shuffle::apply(): in-place matrix");
00077
00078
00079
00080
00081
00082 for(u32 i=0; i<N; ++i)
00083 {
00084 packet_vec[i].val = 0;
00085 }
00086
00087 if(dim == 0)
00088 {
00089 for(u32 i=0; i<N; ++i)
00090 {
00091 if(packet_vec[i].val == 0)
00092 {
00093 const u32 j = packet_vec[i].index;
00094
00095 out.swap_rows(i, j);
00096
00097 packet_vec[j].val = 1;
00098 }
00099 }
00100 }
00101 else
00102 {
00103 for(u32 i=0; i<N; ++i)
00104 {
00105 if(packet_vec[i].val == 0)
00106 {
00107 const u32 j = packet_vec[i].index;
00108
00109 out.swap_cols(i, j);
00110
00111 packet_vec[j].val = 1;
00112 }
00113 }
00114 }
00115 }
00116 }
00117 else
00118 {
00119 if(&out != &X)
00120 {
00121 arma_extra_debug_print("op_shuffle::apply(): vector");
00122
00123 out.copy_size(X);
00124
00125 if(dim == 0)
00126 {
00127 if(X.n_rows > 1)
00128 {
00129 for(u32 i=0; i<N; ++i)
00130 {
00131 out[i] = X[ packet_vec[i].index ];
00132 }
00133 }
00134 else
00135 {
00136 out = X;
00137 }
00138 }
00139 else
00140 {
00141 if(X.n_cols > 1)
00142 {
00143 for(u32 i=0; i<N; ++i)
00144 {
00145 out[i] = X[ packet_vec[i].index ];
00146 }
00147 }
00148 else
00149 {
00150 out = X;
00151 }
00152 }
00153 }
00154 else
00155 {
00156 arma_extra_debug_print("op_shuffle::apply(): in-place vector");
00157
00158
00159
00160
00161
00162 for(u32 i=0; i<N; ++i)
00163 {
00164 packet_vec[i].val = 0;
00165 }
00166
00167 if(dim == 0)
00168 {
00169 if(X.n_rows > 1)
00170 {
00171 for(u32 i=0; i<N; ++i)
00172 {
00173 if(packet_vec[i].val == 0)
00174 {
00175 const u32 j = packet_vec[i].index;
00176
00177 std::swap(out[i], out[j]);
00178
00179 packet_vec[j].val = 1;
00180 }
00181 }
00182 }
00183 }
00184 else
00185 {
00186 if(X.n_cols > 1)
00187 {
00188 for(u32 i=0; i<N; ++i)
00189 {
00190 if(packet_vec[i].val == 0)
00191 {
00192 const u32 j = packet_vec[i].index;
00193
00194 std::swap(out[i], out[j]);
00195
00196 packet_vec[j].val = 1;
00197 }
00198 }
00199 }
00200 }
00201 }
00202 }
00203
00204 }
00205
00206
00207