Подтвердить что ты не робот

Как сопоставить индексы матрицы с 1-мерным массивом (С++)?

У меня есть матрица 8x8, например:

char matrix[8][8];

Кроме того, у меня есть массив из 64 элементов, например:

char array[64];

Затем я нарисовал матрицу в виде таблицы и заполнил ячейки цифрами, каждое число увеличивалось слева направо, сверху вниз.

Если у меня есть, скажем, индексы 3 (столбец) и 4 (строка) в матрице, я знаю, что он соответствует элементу в позиции 35 в массиве, как это видно в таблице, которую я вижу нарисован. Я считаю, что есть какая-то формула для перевода двух индексов матрицы в один индекс массива, но я не могу понять, что это такое.

Любые идеи?

4b9b3361

Ответ 1

Способ, которым большинство языков хранят многомерные массивы, - это сделать следующее преобразование:

Если matrix имеет размер, n на m [т.е. я идет от 0 до (n-1) и j от 0 до (m-1)], тогда:

matrix[ i ][ j ] = array[ i*m + j ].

Таким образом, это точно так же, как система чисел базы 'n'. Обратите внимание, что размер последнего измерения не имеет значения.


Для концептуального понимания подумайте о матрице (3x5) с "i" в качестве номера строки и "j" в качестве номера столбца. Если вы начинаете нумерацию с i,j = (0,0) --> 0. Для упорядочения строки (например, этот) макет выглядит так:

           |-------- 5 ---------|
  Row      ______________________   _ _
   0      |0    1    2    3    4 |   |
   1      |5    6    7    8    9 |   3
   2      |10   11   12   13   14|  _|_
          |______________________|
Column     0    1    2    3    4 

Когда вы двигаетесь вдоль строки (т.е. увеличиваете номер столбца), вы просто начинаете подсчет, поэтому индексы массива 0,1,2.... Когда вы переходите ко второй строке, у вас уже есть записи 5, поэтому вы начинаете с индексов 1*5 + 0,1,2.... В третьей строке у вас есть 2*5 записи, поэтому индексы 2*5 + 0,1,2....

Для большей размерности эта идея обобщается, т.е. для 3D matrix L на N через M:

matrix[ i ][ j ][ k ] = array[ i*(N*M) + j*M + k ]

и т.д.


Для действительно хорошего объяснения см.: http://www.cplusplus.com/doc/tutorial/arrays/; или для некоторых более технических аспектов: http://en.wikipedia.org/wiki/Row-major_order

Ответ 2

Для строкового упорядочения, я считаю, что утверждение matrix[ i ][ j ] = array[ i*n + j ] неверно.

Смещение должно быть offset = (row * NUMCOLS) + column.

Результаты вашего утверждения будут row * NUMROWS + column, что неверно.

Ссылки, предоставленные вами, дают правильное объяснение.

Ответ 3

Что-то вроде этого?

//columns = amount of columns, x = column, y = row
var calculateIndex = function(columns, x, y){
    return y * columns + x;
};

Приведенный ниже пример преобразует индекс обратно в координаты x и y.

//i = index, x = amount of columns, y = amount of rows
var calculateCoordinates = function(index, columns, rows){
    //for each row
    for(var i=0; i<rows; i++){
        //check if the index parameter is in the row
        if(index < (columns * i) + columns && index >= columns * i){
            //return x, y
            return [index - columns * i, i];
        }
    }
    return null;
};

Ответ 4

Хех:)

Я нашел решение без массива)

var mas = [
//   0   1   2
    "1","2","3",
    "4","5","6",
    "7","8","9",
    "0","d","s"
]

var m = mas.index(of: "d")!

let sections = 4
let items = 3



for i in (0...sections) {
   if (m < (items * i) + items && m >= items * i){
       "section: \(i)"
       "item: \(m - items * i)"
   }
}

let section = (m + m % sections) / sections
let item = m - items * section

let index = item + section * items