C语言 矩阵迭代优化的说明



我正在为期末考试做准备,我正在研究一些优化技术。出于某种原因,关于这个特定示例的信息并不多,我不明白,所以也许我可以得到一些帮助。

在Powerpoint幻灯片中,有这个强度降低的例子。

c1 = f();
for ( int i = 0; i < n; i++ ) {
  c2 = c1 + g(i);
  int ri = n * i;
  for ( int j = 0; j < n; j++ )
    a[ ri + j ] = c2 + h(j);
}

可以转化为

c1 = f();
*p = a;
for ( int i = 0; i < n; i++ ){
  c2 = c1 + g(i);
  for ( int j = 0; j < n; j++ )
    *p++ = c2 + h(j);
}

这是怎么回事?我不明白,因为增加指针只是将其向上移动一个元素,而对于每个 i 值,原始指针向上移动的元素远远超过 1。是否有错误或我遗漏了什么?

如果您忽略所有计算,只查看循环计数器...

for ( int i = 0; i < n; i++ ) {
  for ( int j = 0; j < n; j++ )
    printf("%dn", n * i + j);
}

您将看到 ri + j ,即 n * i + j ,从 0(含)到 n2(不包括)计数。 因此,a[ri + j]只是一次一个元素地沿着数组走动。 你可以和p++一起做同样的散步。

代码通过一个由 n*n 个元素组成的数组。在第一个中,它像行和列一样被索引,它们是单独计算然后加在一起的。但是,由于数据在一个没有间隙的数组中,因此无需以这种方式计算索引以进行顺序访问。

如果你考虑第一个索引器:i*n + j,这意味着在 i 上升 1 后,索引器上升 n。在第二个元素中,指针在每个元素之后向前移动一个位置,因此当j循环从 0 变为 n-1 时,i变为 1,指针p向前移动了 n 个元素。所以它指向a[1*n+0],相当于i*n+j在这个位置。这种情况一直持续到最后。

最新更新