LINUX.ORG.RU

n-dimensional arrays: column-major -> row-major offset

 ,


0

1

Есть N-мерный массив размещенный в памяти в виде вектора в порядке column-major (например из фортрана или там матлаба).

Если известны размерности этого N-мерного массива и смещение в нем, какова формула для конвертирования в row-major смещение (как в Си)?

Спасибо :)

★★★

Последнее исправление: Oxdeadbeef (всего исправлений: 1)

Формула скорее будет программистская, а не математическая. С проходом по всем размерностям.

Но перед тем, как её выводить, скажи: ты же понимаешь, что элементы, адрес которых (смещение) ты получишь в общем случае не будут совпадать? Они будут совпадать только при квадратных массивах.

ziemin ★★
()
Ответ на: комментарий от Oxdeadbeef

Ну ты как маленький.

Я пока не совсем понял, почему у тебя только смещение. Если ты хочешь адресацию фортрана перевести в адресацию C, просто поменяй порядок индексов: (i, j, k) -> [k][j][i]

Если у тебя и правда только offset есть и размерности, то смотришь, например, сюда: https://en.wikipedia.org/wiki/Row-major_order#Address_calculation_in_general :

Для адресации arr[n_1][n_2]...[n_d] в row-major offset считается как

n_d + N_d ( n_{d-1} + N_{d-1} (\dots)) == offset

Известно, что n_d \in [0, N_d - 1], т.е. n_d < N_d. Т.е. вышенаписанная формула для offset это ни что иное, как деление offset на N_d нацело:

offset = n_d + N_d * k

Следовательно, n_d = offset mod N_d.

Вычитая n_d из обеих частей формулы и деля на N_d получаем формулу того же вида:

n_{d-1} + N_{d-1} (n_{d-2} + N_{d-2} (\dots)) == \frac {offset - n_d} {N_d}
к которой рекурсивно применяем вышеописанный метод и находим n_{d-1}, n_{d-2}, \dots, n_1.

SystemD-hater
()
Ответ на: комментарий от SystemD-hater

Ну и, естественно, надо понимать, в каких единицах меряется offset: в байтах или в sizeof(arr[0]...[0][0]). Выше подразумевается, что в последних.

SystemD-hater
()
Ответ на: комментарий от SystemD-hater

Так и есть, мне конкретно нужно скопировать из матлабовского массива в сишный (точнее — в лисповый через FFI) для дальнейших манипуляций, и потом обратно. Спасибо за формулы, буду разбираться.

Oxdeadbeef ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.