19.1 Multiple indexing
The following is the simplest concrete example of multiple indexing with an array of integers; the ellipses stand for code defining the variables as indicated in the comments.
array[3] int c;
// ... define: c == (5, 9, 7)
array[4] int idxs;
// ... define: idxs == (3, 3, 1, 2)
array[4] int d;
// result: d == (7, 7, 5, 9) d = c[idxs];
In general, the multiple indexed expression c[idxs]
is defined
as follows, assuming idxs
is of size K
.
c[idxs] = ( c[idxs[1]], c[idxs[2]], ..., c[idxs[K]] )
Thus c[idxs]
is of the same size as idxs
, which is
K
in this example.
Multiple indexing can also be used with multi-dimensional arrays. For example, consider the following.
array[2, 3] int c;
// ... define: c = ((1, 3, 5), ((7, 11, 13))
array[4] int idxs;
// ... define: idxs = (2, 2, 1, 2)
array[4, 3] int d
// result: d = ((7, 11, 13), (7, 11, 13),
d = c[idxs]; // (1, 3, 5), (7, 11, 13))
That is, putting an index in the first position acts exactly the same
way as defined above. The fact that the values are themselves arrays
makes no difference—the result is still defined by c[idxs][j] == c[idxs[j]]
.
Multiple indexing may also be used in the second position of a multi-dimensional array. Continuing the above example, consider a single index in the first position and a multiple index in the second.
array[4] int e;
2, idxs]; // result: c[2] = (7, 11, 13)
e = c[// result: e = (11, 11, 7, 11)
The single index is applied, the one-dimensional result is determined,
then the multiple index is applied to the result. That is,
c[2,idxs]
evaluates to the same value as c[2][idxs]
.
Multiple indexing can apply to more than one position of a multi-dimensional array. For instance, consider the following
array[2, 3] int c;
// ... define: c = ((1, 3, 5), (7, 11, 13))
array[3] int idxs1;
// ... define: idxs1 = (2, 2, 1)
array[2] int idxs2;
// ... define: idxs2 = (1, 3)
array[3, 2] int d;
// result: d = ((7, 13), (7, 13), (1, 5)) d = c[idxs1, idxs2];
With multiple indexes, we no longer have c[idxs1, idxs2]
being
the same as c[idxs1][idxs2]
. Rather, the entry d[i, j]
after executing the above is given by
d[i, j] == c[idxs1, idxs2][i, j] = c[idxs1[i], idxs2[j]]
This example illustrates the operation of multiple indexing in the
general case: a multiple index like idxs1
converts an index
i
used on the result (here, c[idxs1, idxs2]
) to index
idxs1[i]
in the variable being indexed (here, c
). In
contrast, a single index just returns the value at that index, thus
reducing dimensionality by one in the result.