2

在 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]。他们声称这更有效,因为它避免了整数乘法。缺点是必须分别初始化每个指针。

我想知道,每种方法的优点/缺点是什么?

4

1 回答 1

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)

它为程序员做更多的工作,如果你想走得很快,可能才值得。在这种情况下,您可能需要研究更多优化,例如特定的机器指令。此外,根据您的算法,您可以只使用 + 操作(例如,如果您正在迭代矩阵)

于 2012-07-15T04:14:12.823 回答