【问题标题】:Explanation of matrix iteration optimization矩阵迭代优化说明
【发布时间】:2015-07-09 08:39:45
【问题描述】:

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

在 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。是有什么错误还是我遗漏了什么?

【问题讨论】:

  • 因为递增*p 相当于索引a[ri + j]
  • 这个想法是指针将继续前进,所以在一个 j 循环之后它将指向 a[n],在两个 a[2*n] 之后等。这就是为什么它不需要 ri在里面。
  • 为了相同,你必须输入p = a;而不是*p = a;,否则你会遇到麻烦。

标签: c loops optimization matrix iteration


【解决方案1】:

如果你忽略所有的计算,只看循环计数器……

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

您会看到ri + j,即n * i + j,从 0(含)计数到 n2(不含)。因此,a[ri + j] 只是一次沿着数组走一个元素。您可以使用p++ 进行相同的步行。

【讨论】:

    【解决方案2】:

    代码遍历一个 n*n 元素的数组。在第一个中,它像按行和列一样被索引,分别计算然后相加。但是由于数据在一个数组中没有间隙,所以顺序访问不需要这样计算索引。

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

    【讨论】:

      猜你喜欢
      • 2017-06-28
      • 2019-12-16
      • 2016-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-30
      • 1970-01-01
      • 2020-03-10
      相关资源
      最近更新 更多