A note added: Although the coding below is correct, it has clearly been superseeded by the following two entries contributed by acer: Entry 1 and Entry 2.
As in any fairytale (even though this blog of mine certainly is not) it takes three of something (at least according to the fairytales of my fellow-countryman H. C. Andersen). Todays entry is the third and last (at least for now) in a row of three consecutive ones dealing with manipulations of indices of Arrays. The other two entries are Tip: Index an Array and Tip: Permute the indices of an Array.
Whereas permuting the indices of an Array requires all dimensions to be of equal size, transposing a pair indices only requires the dimensions of the two indices in question to be of equal size. By now, at least for those who have read Tip: Index an Array and Tip: Permute the indices of an Array, it probably comes as no surprise that the method uses a procedure of the type `index/method`, and (yes, you guessed correctly) it originates from "Gravitation". Here it comes:
setIndexTranspose := proc(index1::posint,index2::posint)
`index/transpose` := proc(indices::list,array::Array,value::list)
if nargs = 2 then
index1_,index2_ := min(index1,index2),max(index1,index2):
] := value:
An example which performs B[i,k,j] := A[i,j,k] for all (i,j,k):
A := Array(1..3,1..3,1..3,(i,j,k)->i*j-k^2):
B := Array(transpose,A):
PS: As for Tip: Permute the indices of an Array suggestions of improvements (especially concerning the else-statement, again) are of course quite welcome.