Обычно вы итерируете матрицу с вложенным циклом
for (int i = 0; i < rows; ++i)
for (int j = 0; j < cols; ++j)
doSomething(matrix[i][j]);
Это будет перечислять строки, если вы поменяете местами индексы:
for (int i = 0; i < rows; ++i)
for (int j = 0; j < cols; ++j)
doSomething(matrix[j][i]);
Тогда вы будете перечислять по столбцам.
В вашем случае у вас, похоже, есть матрица, которая хранится в виде простого массива, поэтому вы можете получить из двух циклов, которые являются вашей функцией адресации, обычный доступ к строке равен (x/row_size)*row_size + x%row_size
, поэтому вы итерируете элементы row_size
перед переключением в следующий ряд.
Если вы слегка измените его: (x%col_size)*row_size + x/col_size
вы получите функцию, которая добавляет к каждой итерации row_size
(reching nth row), а затем значение, которое увеличивается каждые col_size
элементов (так каждый раз, когда вы заканчиваете столбец) , Это должно работать ..
РЕДАКТИРОВАТЬ: Ой, подождите, пропустил этот фактор группировки, позвольте мне обновить мой ответ .. вы можете сделать что-то вроде
assert (cols % n == 0); /* we don't like not precise matrices */
for (int i = 0; i < cols / n; ++i)
for (int j = 0; j < rows; ++j)
for (int k = 0; k < n; ++n)
doSomething(matrix[j][i+k]);
Или в простом массиве:
(x%n) + row_size*(x/n) + (x / (col_size*n))*n
^ ^ ^
| | |
| | reposition after a group of columns
| moves vertically in the same group
moves horizontally on the group
где n
- количество столбцов в группе