перечислить сгруппированные столбцы по вертикали - PullRequest
0 голосов
/ 15 июля 2010

Если бы у меня была матрица, которая повторяется по горизонтали, а затем по вертикали, она бы перечислила так:

    0  1  2  3  4  5  6  7  8  9
   ------------------------------
0 |  1  2  3  4  5  6  7  8  9 10
1 | 11 12 13 14 15 16 17 18 19 20
2 | 21 22 23 24 25 26 27 28 29 30

, если я хочу перечислить по вертикали, я могла бы сделать это:У кого-нибудь есть удобный алгоритм для перечисления сгруппированных столбцов по вертикали?

    ????

    0  1  2  3  4  5  6  7  8  9
   ------------------------------
 0 |1  2  7  8 13 14 19 20 25 26
 1 |3  4  9 10 15 16 21 22 27 28
 2 |5  6 11 12 17 18 23 24 29 30

Ответы [ 3 ]

2 голосов
/ 15 июля 2010
cols_per_group=2;

(total_rows*cols_per_group)*((int)(coln/cols_per_group))
+(coln%cols_per_group)+cols_per_group*rown +1

т.е. (общий размер группы) * (в какой группе вы находитесь) + (горизонтальная позиция в группе) + (ширина группы) * (вертикальная позиция в группе) + 1

1 голос
/ 15 июля 2010

Что-то вроде этого возможно?

for(group = 0; group < maxCol/2; group += 2)
{
    for(row = group; row < maxRows; row++)
    {
        for(col = 0; col < group + 2; col++)
        {
            matrix[col][row];
        }
    }
}

Это было забавно думать о ^ _ ^

1 голос
/ 15 июля 2010

Обычно вы итерируете матрицу с вложенным циклом

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 - количество столбцов в группе

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...