In a carefully designed Yorick program, array dimensions usually wind up
where you need them. However, you may occasionally wind up with a
five-by-seven array, instead of the seven-by-five array you wanted.
Yorick has a very general transpose function:
x623451 = transpose(x123456);
x561234 = transpose(x123456, 3);
x345612 = transpose(x123456, 5);
x153426 = transpose(x123456, [2,5]);
x145326 = transpose(x123456, [2,5,3,4]);
x653124 = transpose(x123456, [2,5], [1,4,6]);
Here, x123456 represents a six-dimensional array (hopefully these
will be rare). The same array with its first and last dimensions
transposed is called x623451; this is the default result of
transpose. The transpose function can take any number of
additional arguments to describe an arbitrary permutation of the indices
of its first argument -- the array to be transposed.
A scalar integer value, as in the second and third lines, represents a
cyclic permutaion of all the dimensions; the first dimension of the
input becomes the Nth dimension of the result, for an argument value of
An array of integer values represents a cyclic permutation of the
specified dimensions. Hence, in the fifth example, [2,5,3,4]
means that the second dimension becomes the fifth, the fifth becomes the
third, the third becomes the fourth, and the fourth becomes the second.
An arbitrary permutation may be built up of a number of cyclic
permutations, as shown in the sixth example.
One additional problem can arise in Yorick -- you may not know how many
dimensions the array to be transposed has. In order to deal with this
possibility, either a scalar argument or any of the numbers in a cyclic
permutation list may be zero or negative to count from the last
dimension. That is, 0 represents the last dimension, -1 the next to
last, -2 the one before that, and so on.
Typical transposing tasks are: (1) Move the first dimension to be last,
and all the others back one cyclically. (2) Move the last dimension
first, and all the others forward one cyclically. (3) Transpose the
first two dimensions, leaving all others fixed. (4) Transpose the final
two dimensions, leaving all others fixed. These would be accomplished,
in order, by the following four lines:
x234561 = transpose(x123456, 0);
x612345 = transpose(x123456, 2);
x213456 = transpose(x123456, [1,2]);
x123465 = transpose(x123456, [0,-1]);