Multidimensional arrays seem to be easily created by just a structure with one field pointing to a vector and the other containing the dimensions like 3,3,3 or 10,10 etc.

The one thing needed for an matrix of any dimension is an "accessor" or "combinator" work that just indexes into the vector by the "offsets" needed to pick the rows, columns, pages etc. from the vector.

Once you have these selector functions then any function can be mapped over the intermediate results.

At stackexchange whenever a question pops up like "why doesn't language x have multidimensional arrays" of "how do I create a data structure for a "chessboard" the answer is frequently "why not just create your own accessor functions or equivalent?". Making these accessor functions part of the language can't be that difficult.

There is listing below. The last one shows the pattern needed to select "columns" from a flat vector. Using this approach a multidimensional array is just a vector with optional record fields for information like dimension and type.

So an "array" language is really nothing more than a bit of extra work to create a few accessor functions to pull row and column data from a flat vector then map other functions over that data. The first innovation was just the idea of mapping over a vector but extending that to higher dimensions is not done. This seems really easy to me. The question is why isn't this done in every language? Writing the naked lopping code every time a multidimensional array needs to be worked on seems like a trillion dollar waste of time.

The code concept below works on simple vectors without needed extra dimension data.

Full "moving window" with no shards

f monad or dyad is applied to data in each (window)

a=.1 2 3 4 5 6 7 8 9 10

mwin 3 3;a;f (1 2 3) (4 5 6) (7 8 9)

mwin 3 1;a;f (1 2 3) (2 3 4) (3 4 5) .....(8 9 10)

mwin 3 5;a;f (1 2 3) (5 6 7)

mwin 1 1;a;f (1 2 3 4 5 6 7 8 9 10)

mwin 1 2;a;f (1) 2 (3) 4 (5) 6 (7) 8 (9) 10

assuming a 2 x 5 matrix in a vector 1 2 3 4 5 6 7 8 9 10 :

mwin 5 5;a;f ((1 2 3 4 5)(6 7 8 9 10)useful for applying functions along rows

mwin 1 6;1;a;f (1 6) (2 7)(3 8)(4 9) (5 10) useful for applying functions along columns