Mapping a 2D Array into 1D Array with Variable Column Width

Mapping a 2D Array into 1D Array with Variable Column Width

I know mapping 2D array into 1D array has been asked many times, but I did not find a solution that would fit a where the column count varies.

So I want get a 1-dimensional index from this 2-dimensional array

     Col>   _0____1____2__
     Row 0 |_0__|_1__|_2__|
     V   1 |_3__|_4__|
         2 |_5__|_6__|_7__|
         3 |_8__|_9__|
         4 |_10_|_11_|_12_|
         5 |_13_|_14_|

The normal formula index = row * columns + column does not work, since after the 2nd row the index is out of place.

What is the correct formula here?

EDIT:

The specific issue is that I have a list of items in with the layout like in the grid, but a one dimensional array for the data. So while looping through the elements in the UI, I need to get the correct data, but can only get the row and column for that element. I need to find a way to turn a row/column value into an index for the data-array

Bad picture trying to explain it

1

3 Answers

A truly optimal answer (or even a provably correct one) will depend on the language you are using and how it lays out memory for such arrays.

However, taking your question simply at face value, you have to know what the actual length of each row is in order to calculate a 1D index.

So either the row length follows some pattern that can be inferred from the data, or you have (or can write) a rlen = rowLength( 2dTable, RowNumber) function.

Then, depending on how big the tables are and how fast you need to run, you can calculate a 1D index from the 2d table by adding all the previous row lengths until the current row length is less than the 2d column index.

or build a 1d table of the row lengths (or commulative rowlengths) so you can scan it and so only call your rowlength function for each row only once.

With a better description of your problem, you might get a better answer...

For your example which alternates between 3 and 2 columns you can construct a formula:

index = (row / 2) * (3 + 2) + (row % 2 ? 3 : 0) + column

(C-like syntax, assuming integer division)

In general though, the one and only way to implement what you're doing here, jagged arrays, is to make an array of arrays, a.k.a. an Iliffe vector. That means, use the row number as index into an array of pointers which point to the individual row arrays containing the actual data.

2

You can have an additional 1D array having the length of the columns say "length". Then your formula is index=sum {length(i)}+column. i runs from 0 to row.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Robert Thorne
Author

Robert Thorne

Robert Thorne covers electric vehicle innovations, autonomous driving systems, global mobility trends, and automotive engineering developments.