使用布尔“掩码”数组进行数组索引

时间:2019-10-17 10:09:15

标签: c arrays indexing boolean mask

我有一个非常大的数组,其行数和行数为(nr,nc)。我遍历此数组以从该数组的常量项(px,py)计算函数“ fun”。此功能的计算仅在此点附近的恒定区域(距离d)中相关。因此,我的目标是加快代码的执行速度,并且仅在该点(px,py)周围的圆中进行计算。

int i;
int j;
for(i=0; i<nr; i++){
    for(j=0; j<nc; j++){
        *(arr_stg+i*nc+j) = fun(i,j,px,py);
    }
}

我还有一个计算布尔“掩码”的函数(我不知道这是否是正确的词)。我用一个采样点周围的欧式距离来计算它。因此,对于给定的距离,即4,我计算出这种掩码数组:

0 0 0 0 1 0 0 0 0
0 0 0 1 1 1 0 0 0
0 0 1 1 1 1 1 0 0
0 1 1 1 1 1 1 1 0
1 1 1 1 1 1 1 1 1
0 1 1 1 1 1 1 1 0
0 0 1 1 1 1 1 0 0
0 0 0 1 1 1 0 0 0
0 0 0 0 1 0 0 0 0

确切的格式(如果是零或一)在这里无关紧要,应该适用于任何这种nxn-“ masks”。

我的问题是,如何更改两个for循环,以仅在给定点周围的此蒙版上进行迭代,从而获得更快的代码,然后仅对大数组的所有i,j进行计算,不要使用距离大于给定距离的距离。

1 个答案:

答案 0 :(得分:1)

通常,如果您有一个d大小的遮罩,其围绕点(xc, yc),则需要遍历以下范围:

(xc - d) <= x <= (xc + d)
(yc - d) <= y <= (yc + d)

或者,如果您有一个掩码数组MASK[2*d+1, 2*d+1],那么您最终会得到以下结果:

// iterate through MASK dimensions
for (var mi = 0; mi < 2 * d + 1; mi++)
   for (var mj = 0; mj < 2 * d + 1; mj++)
   {
        // move to the right location
        var x = xoffset + mi;
        var y = yoffset + mj;

        // do something with (x, y) and MASK[mi, mj]
   }

但是,您需要确保xoffset + miyoffset + mj不会超出界限。