GSL与数字食谱。处理矩阵的最佳方法

时间:2012-07-15 03:16:39

标签: c gsl

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

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

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)

它对程序员来说更多的工作,如果你想要快速前进,可能还是值得的。在这种情况下,您可能希望查看更多优化,例如特定的机器指令。此外,根据您的算法,您可以只使用+操作(就像您在矩阵上迭代一样)