假设我有一个4x4数组,该数组按行的主要顺序被平放,并且我希望在一个新的1D数组中收集每2x2个窗口中的一个条目,这将导致:
0,2,8,10
对于4x8,它将导致0,2,4,6,16,18,20,22。
对于8x4,它将导致0,2,8,10,16,18,24,26。
实现这一目标的简单循环:
const int STEP = 2;
for(int i = 0; i < len; ++i)
arr[i] = i * STEP + (i*STEP / SIZE_Y) * SIZE_Y;但是,当数组大小在任何维度上都是奇数时,我会遇到问题。3x3应该导致
0,2,6,8但在0,2,7,12中
我如何扩展我的公式,使它不会变得过于复杂,处理所有这些边界-情况,但仍然适用于一般情况?
发布于 2015-11-19 17:19:22
我使用了嵌套循环,它工作得非常完美,而且它更容易理解:
int width, height;
width = (int) ceil((double)SIZE_Y/STEP);
height = (int) ceil((double)SIZE_X/STEP);
int[] arr = new int[width*height];
for(int i=0; i < height; i ++){
for(int j=0; j < width; j ++){
arr[i*width+j] = STEP*i*SIZE_Y + STEP*j;
}
} 但是,如果您仍然坚持使用可读的单循环-less --则可以使用此单循环:
for(int i=0; i<width*height; i++)
{
arr[i] = (i%width)*STEP + (i/width)*SIZE_Y*STEP;
}https://stackoverflow.com/questions/33807252
复制相似问题