计算 C 数组的行列式

4
我已经编写了一个程序,它生成一些N x N矩阵,我想计算它们的行列式。关于此,我有两个问题:
  • 哪个库最适合做到这一点?我希望使用最快的库,因为我有数百万个这样的矩阵。
  • 在将结果转换为整数时是否需要注意任何具体事项?所有我将生成的矩阵都具有整数行列式,我希望确保没有舍入误差会影响行列式的正确值。
编辑。如果可能,请提供使用推荐库计算行列式的示例。

3
所以你说的“几个”指的是“数百万”?很棒。 - unwind
3个回答

4
关于矩阵库,似乎问题在这里已有答案:Recommendations for a small c-based vector and matrix library 关于转换为整数:如果行列式不是整数,则不应将其转换为整数,而应使用round、floor或ceil以一种可接受的方式进行转换。这些可能会给您整数值,但您仍需要将它们强制转换;但是,现在您可以这样做,而不必担心丢失任何信息。

1
实际上,floor并不返回整数;至于round:https://dev59.com/rXRB5IYBdhLWcg3w3K4J(这是针对c++的,但也适用于c) - anatolyg

3
您可以通过blas和lapack处理矩阵,它们实际上是用fortran编写的,从“c”中使用它们有点折衷,但总的来说,它们可以以惊人的速度处理数字。 http://www.netlib.org/lapack/lug/node11.html

你确定它们包含计算行列式的例程吗? LAPACK FAQ(http://www.netlib.org/lapack/faq.html#_are_there_routines_in_lapack_to_compute_determinants)指出没有这样的例程。 - Jernej
FAQ还说LAPACK可以解决特征问题(http://www.netlib.org/lapack/faq.html#_what_and_where_is_lapack)。矩阵的行列式是其特征值的乘积。 - andand
1
没错。但特征值可能是一些复杂的实数,其乘积会使计算变得不稳定。 - Jernej

2
你有GSL,但选择取决于你的矩阵。这些矩阵是密集的还是稀疏的?N是大还是小?对于小的N,你可能会发现使用Cramer法则或高斯消元自己编写行列式比使用大矩阵性能库更快,因为它们的优化可能会在简单问题上引入开销。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接