在GSL中,真实的n * m
矩阵M
在内部表示为大小为n*m
的数组。要访问M
的(i,j)元素,内部GSL必须访问数组的(i-1) * n + j - 1
位置,这涉及整数乘法和加法。
在C的Numerical Recipes中,他们推荐使用另一种声明n
指针数组的方法,每个指针指向一个m
数组。然后,为了访问(i,j)元素,可以放置M[i-1][j-1]
。他们声称这更有效,因为它避免了整数乘法。缺点是必须分别初始化每个指针。
我想知道,每种方法的优点/缺点是什么?
答案 0 :(得分:3)
在C:
#define n 2
#define m 3
int M[n*m];
与
相同int M[n][m];
据说C矩阵中的以行主顺序存储
http://en.wikipedia.org/wiki/Row-major_order
在C中,
M[1][2]
与
相同*(M + 1*m + 2) // if M is define as M[n][m]
您可以将M定义为n个指针的数组,但您仍然必须将数据放在某处,最佳位置可能是2D数组。我建议:
int M[n][m];
int* Mrows[n] = {M[0], M[1]};
然后,您可以直接对行进行偏移以获得所需的行。然后:
Mrows[1][2]
与
相同*((*(Mrows + 1)) + 2)
它对程序员来说更多的工作,如果你想要快速前进,可能还是值得的。在这种情况下,您可能希望查看更多优化,例如特定的机器指令。此外,根据您的算法,您可以只使用+操作(就像您在矩阵上迭代一样)