垂直枚举分组列

时间:2010-07-15 00:05:11

标签: java algorithm math matrix

如果我有一个水平迭代的矩阵然后垂直迭代它会这样枚举:

    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

如果我想垂直枚举,我可以这样做:

  total_rows * coln+ rown+ 1

   0 1 2  3  4  5  6  7  8  9
  --------------------------
0 |1 4 7 10 13 16 19 22 25 28
1 |2 5 8 11 14 17 20 23 26 29
2 |3 6 9 12 15 18 21 24 27 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 个答案:

答案 0 :(得分:2)

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 :(得分:1)

通常使用嵌套循环

迭代矩阵
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,所以你迭代{{1}切换到下一行之前的元素。

如果稍微更改一下:row_size您获得的功能是广告每次迭代都会添加(x%col_size)*row_size + x/col_size(第n行),然后是每row_size个元素增加的值(所以每个你完成专栏的时间)。这应该有用..

编辑:哦等等错过了分组因素,让我更新我的答案..你可以做类似的事情

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 是每组的列数

答案 2 :(得分:1)

或许这样的事情?

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

考虑^ _ ^

这很有趣