September 9, 2022

I’ve long been confused by the two definitions of the word *dimension*.
Sometimes we talk about a 3-dimensional array:

float a[5][6][7];

and sometimes we talk about a 3-dimensional vector:

float v[3];

I finally figured out that the word is only correctly used in the second
example above. In the first example, the term should be *rank*, as in,
“a rank-3 array”.

So *rank* is the *number of indices* that you need to get to a scalar. In
the first example you need three indices to get a float:

x = a[i][j][k];

Each of these indices has a range of valid values, and this is the *dimension*
of that index. Again with the first example, the dimension of the first index
is 5, of the second is 6, and of the third is 7. This is why it’s correct to
call the second example “a 3 dimensional vector”. It has rank 1 and its only
index can have three values (0, 1, and 2). Vectors are always rank 1 and
matrices are always rank 2.

Looks like this terminology has always been used in mathematics. I wonder why
in programming we misappropriated *dimension* to mean *rank*.

(Cover image credit: Midjourney, “photorealistic large infinite matrices in space hypercube 3d multidimensional”)