我有一个非常大的数组,其行数和行数为(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进行计算,不要使用距离大于给定距离的距离。
答案 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 + mi
和yoffset + mj
不会超出界限。