在 GSL 中,实n * m
矩阵M
在内部表示为大小为 的数组n*m
。要访问 的 (i,j) 元素M
,内部 GSL 必须访问(i-1) * n + j - 1
数组的位置,这涉及整数乘法和加法。
在 C 的数值配方中,他们推荐了声明一个指针数组的替代方法n
,每个指针都指向一个m
数字数组。然后访问 (i,j) 元素,一个 puts M[i-1][j-1]
。他们声称这更有效,因为它避免了整数乘法。缺点是必须分别初始化每个指针。
我想知道,每种方法的优点/缺点是什么?
在 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)
它为程序员做更多的工作,如果你想走得很快,可能才值得。在这种情况下,您可能需要研究更多优化,例如特定的机器指令。此外,根据您的算法,您可以只使用 + 操作(例如,如果您正在迭代矩阵)