c - 矩阵迭代优化的解释

标签 c loops optimization matrix iteration

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

在 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("%d\n", n * i + j);
}

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

关于c - 矩阵迭代优化的解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29954270/

相关文章:

ruby - 将多维数组缩减为更小的多维数组

algorithm - 相邻边对的最小生成树

java - 如何进一步优化代码?

c++ - 有人可以告诉我任何不同的方法来使这段代码更快吗?

c - 如何在Winsock中发送文件(http方式)

c - 使用 execvp 执行 grep,从管道读取

c# - 为什么我不能在匿名方法中的while循环中使用break?

PHP 查找两点之间的坐标

C语言。如何在 SCANF 中使用字符串值作为分隔符

c - 链表从闪存过渡到 Ram