| 3180 | // ------------------------------------------------------------------------------------ |
| 3181 | |
| 3182 | void transpose( |
| 3183 | bool add, |
| 3184 | tensor& dest, |
| 3185 | const tensor& src |
| 3186 | ) |
| 3187 | { |
| 3188 | DLIB_CASSERT(dest.num_samples() == src.num_samples() && |
| 3189 | dest.k() == src.k() && |
| 3190 | dest.nr() == src.nc() && |
| 3191 | dest.nc() == src.nr(), |
| 3192 | "Incompatible tensor dimensions."); |
| 3193 | |
| 3194 | const float* src_data = src.host(); |
| 3195 | float* dest_data = dest.host(); |
| 3196 | |
| 3197 | const long num_samples = src.num_samples(); |
| 3198 | const long k_dim = src.k(); |
| 3199 | const long src_nr = src.nr(); |
| 3200 | const long src_nc = src.nc(); |
| 3201 | const long dest_nr = dest.nr(); |
| 3202 | const long dest_nc = dest.nc(); |
| 3203 | |
| 3204 | parallel_for(0, num_samples * k_dim, [&](long i) { |
| 3205 | const long n = i / k_dim; |
| 3206 | const long k = i % k_dim; |
| 3207 | const long src_nk_offset = (n * src.k() + k) * src_nr; |
| 3208 | const long dest_nk_offset = (n * dest.k() + k) * dest_nr; |
| 3209 | |
| 3210 | for (long r = 0; r < src_nr; ++r) { |
| 3211 | for (long c = 0; c < src_nc; ++c) { |
| 3212 | const long src_idx = (src_nk_offset + r) * src_nc + c; |
| 3213 | const long dest_idx = (dest_nk_offset + c) * dest_nc + r; |
| 3214 | |
| 3215 | if (add) dest_data[dest_idx] += src_data[src_idx]; |
| 3216 | else dest_data[dest_idx] = src_data[src_idx]; |
| 3217 | } |
| 3218 | } |
| 3219 | }); |
| 3220 | } |
| 3221 | |
| 3222 | // ------------------------------------------------------------------------------------ |
| 3223 | |