Как сопоставить индексы матрицы с 1-мерным массивом (С++)?
У меня есть матрица 8x8, например:
char matrix[8][8];
Кроме того, у меня есть массив из 64 элементов, например:
char array[64];
Затем я нарисовал матрицу в виде таблицы и заполнил ячейки цифрами, каждое число увеличивалось слева направо, сверху вниз.
Если у меня есть, скажем, индексы 3 (столбец) и 4 (строка) в матрице, я знаю, что он соответствует элементу в позиции 35 в массиве, как это видно в таблице, которую я вижу нарисован. Я считаю, что есть какая-то формула для перевода двух индексов матрицы в один индекс массива, но я не могу понять, что это такое.
Любые идеи?
Ответы
Ответ 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