2012-07-05 55 views
4

我已经编写了一个程序,生成一些我想计算它们的行列式的N x N矩阵。与此相关,我有两个问题计算C数组的行列式

  • 什么库是最好的做法?因为我有数百万这样的矩阵,所以我希望尽可能快的库。

  • 将结果转换为整数时,我应该注意哪些细节?我将生成的所有矩阵都有整数行列式,我想确保没有舍入误差会歪曲行列式的正确值。

编辑。如果可能,请提供计算推荐库的决定因素的示例。

+3

那么你的意思是“数以百万计”?凉。 – unwind 2012-07-05 13:34:31

回答

4

至于矩阵库,它看起来像这个问题,在这里回答:

Recommendations for a small c-based vector and matrix library

至于铸造到一个整数:如果决定不整数,那么你不应该将其转换为整数,您应该使用roundfloorceil以可接受的方式对其进行转换。这些可能会给你不可或缺的价值,但你仍然需要施展它们;但是,您现在可以这样做,而不用担心丢失任何信息。

+1

实际上'floor'不返回一个整数;至于'圆':http://stackoverflow.com/questions/485525/round-for-float-in-c(这是C++,但也适用于C) – anatolyg 2012-07-05 13:41:57

+0

@anatolyg:谢谢,更新我的答案 – Dancrumb 2012-07-05 13:56:45

3

你可以用blas和lapack制作奇迹。它们实际上是用fortran编写的,从“c”中使用它们是一种调整。但总的来说,他们可以以惊人的速度收缩数字。

http://www.netlib.org/lapack/lug/node11.html

+0

你是肯定他们含有rutines来计算行列式? LAPACK常见问题(http://www.netlib.org/lapack/faq.html#_are_there_routines_in_lapack_to_compute_determinants)指出没有这样的例程。 – Jernej 2012-07-05 14:30:35

+0

该常见问题解答还表示LAPACK可以解决特征问题(http://www.netlib.org/lapack/faq.html#_what_and_where_is_lapack)。矩阵的行列式是其特征值的乘积。 – andand 2012-07-05 14:45:07

+1

对。但是,特征值可能是令人讨厌的实数,其中一个混乱的产品会使计算不稳定 – Jernej 2012-07-05 16:48:54

2

你有GSL,但选择真的取决于你的矩阵。矩阵密集还是稀疏? N大还是小?对于小型N,您可能会发现使用Cramer规则或Gauss消除自己编码行列式的速度更快,因为大多数高性能函数库专注于大矩阵,并且其优化可能会在简单问题上引入开销。