@@ -44,33 +44,59 @@ void TransposeLayer::transpose_impl(const Tensor& input, Tensor& output,
4444 }
4545 Shape new_shape (new_dims);
4646
47- std::vector<T> output_values (input_data->size ());
48-
49- std::vector<size_t > new_indices (shape.dims ());
50- std::vector<size_t > old_indices (shape.dims ());
47+ std::vector<size_t > input_strides (shape.dims ());
48+ size_t stride = 1 ;
49+ for (size_t dim = shape.dims (); dim-- > 0 ;) {
50+ input_strides[dim] = stride;
51+ stride *= shape[dim];
52+ }
5153
52- for ( size_t i = 0 ; i < input_data-> size (); ++i) {
53- size_t remaining = i ;
54- for (size_t dim = shape .dims (); dim-- > 0 ;) {
55- old_indices [dim] = remaining % shape[dim] ;
56- remaining /= shape [dim];
57- }
54+ std::vector< size_t > output_strides (new_shape. dims ());
55+ stride = 1 ;
56+ for (size_t dim = new_shape .dims (); dim-- > 0 ;) {
57+ output_strides [dim] = stride ;
58+ stride *= new_shape [dim];
59+ }
5860
59- for (size_t dim = 0 ; dim < perm.size (); ++dim) {
60- new_indices[dim] = old_indices[static_cast <size_t >(perm[dim])];
61- }
61+ std::vector<T> output_values (input_data->size ());
6262
63- size_t new_index = 0 ;
64- size_t stride = 1 ;
65- for (size_t dim = new_shape.dims (); dim-- > 0 ;) {
66- new_index += new_indices[dim] * stride;
67- stride *= new_shape[dim];
63+ if (shape.dims () == 2 ) {
64+ const size_t rows = shape[0 ];
65+ const size_t cols = shape[1 ];
66+
67+ if (perm[0 ] == 1 && perm[1 ] == 0 ) {
68+ for (size_t i = 0 ; i < rows; ++i) {
69+ for (size_t j = 0 ; j < cols; ++j) {
70+ output_values[j * rows + i] = (*input_data)[i * cols + j];
71+ }
72+ }
73+ } else {
74+ for (size_t i = 0 ; i < input_data->size (); ++i) {
75+ size_t old_index = i;
76+ size_t new_index = 0 ;
77+
78+ for (size_t dim = 0 ; dim < perm.size (); ++dim) {
79+ const size_t axis = static_cast <size_t >(perm[dim]);
80+ const size_t coord = (old_index / input_strides[axis]) % shape[axis];
81+ new_index += coord * output_strides[dim];
82+ }
83+
84+ output_values[new_index] = (*input_data)[i];
85+ }
6886 }
69-
70- if (new_index >= output_values.size ()) {
71- throw std::runtime_error (" Index out of bounds during transposition" );
87+ } else {
88+ for (size_t i = 0 ; i < input_data->size (); ++i) {
89+ size_t old_index = i;
90+ size_t new_index = 0 ;
91+
92+ for (size_t dim = 0 ; dim < perm.size (); ++dim) {
93+ const size_t axis = static_cast <size_t >(perm[dim]);
94+ const size_t coord = (old_index / input_strides[axis]) % shape[axis];
95+ new_index += coord * output_strides[dim];
96+ }
97+
98+ output_values[new_index] = (*input_data)[i];
7299 }
73- output_values[new_index] = (*input_data)[i];
74100 }
75101
76102 output = make_tensor (output_values, new_shape);
0 commit comments