目前我正在开发一个使用矩阵的程序。我想出了这个嵌套循环来将两个矩阵相乘:
// The matrices are 1-dimensional arrays
for (int i = 0; i < 4; i++)
for (int j = 0; j < 4; j++)
for (int k = 0; k < 4; k++)
result[i * 4 + j] += M1[i * 4 + k] * M2[k * 4 + j];
循环有效。我的问题是:与像这样手动全部写出来相比,这个循环会更慢吗:
result[0] = M1[0]*M2[0] + M1[1]*M2[4] + M1[2]*M2[8] + M1[3]*M2[12];
result[1] = M1[0]*M2[1] + M1[1]*M2[5] + M1[2]*M2[9] + M1[4]*M2[13];
result[2] = ... etc.
因为在嵌套循环中,计算了数组位置,而在第二种方法中,它们没有计算。
谢谢。
最佳答案
与很多事情一样,“视情况而定”,但在这种情况下,我倾向于第二种扩展形式,其表现几乎相同。任何现代编译器都会为您展开适当的循环并处理它。
有两点可能值得提出:
第二种方法比较丑陋,更容易出错并且编写/维护起来很乏味。
这是 'premature optimization' 的一个很好的例子(又名万恶之源)。你知道这部分是否是瓶颈吗?这真的是代码中最密集的部分吗?如果我们没有对我们的代码进行基准测试,那么通过这么早的优化,我们会产生第 1 点中的一切,这相当于一种预感。
关于c++ - 使用 for 循环的矩阵乘法会降低性能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25514110/