如何快速计算C中6×6矩阵的行列式?
发布时间:2020-12-16 09:46:56 所属栏目:百科 来源:网络整理
导读:在C中我需要非常快速地计算6×6矩阵的行列式. 这是我如何为2×2矩阵执行此操作: double det2(double A[2][2]) { return A[0][0]*A[1][1] - A[0][1]*A[1][0];} 我想要一个6×6矩阵的行列式的类似函数,但我不想手工编写,因为它包含6! = 720项,其中每个项是矩
在C中我需要非常快速地计算6×6矩阵的行列式.
这是我如何为2×2矩阵执行此操作: double det2(double A[2][2]) { return A[0][0]*A[1][1] - A[0][1]*A[1][0]; } 我想要一个6×6矩阵的行列式的类似函数,但我不想手工编写,因为它包含6! = 720项,其中每个项是矩阵中6个元素的乘积. 因此我想使用莱布尼兹公式: static int perms6[720][6]; static int signs6[720]; double det6(double A[6][6]) { double sum = 0.0; for(int i = 0; i < 720; i++) { int j0 = perms6[i][0]; int j1 = perms6[i][1]; int j2 = perms6[i][2]; int j3 = perms6[i][3]; int j4 = perms6[i][4]; int j5 = perms6[i][5]; sum += signs6[i]*A[0]*A[j0]*A[1]*A[j1]*A[2]*A[j2]*A[3]*A[j3]*A[4]*A[j4]*A[5]*A[j5]; } return sum; } 我如何找到排列和符号? 有没有什么方法可以让编译器完成更多的工作(例如C宏或模板元编程),这样功能会更快? 编辑: Matrix<double,6,6> A; // ... fill A for(long i = 0; i < 1e6; i++) { PartialPivLU< Matrix<double,6> > LU(A); double d = LU.determinant(); } 到1.25秒.所以使用LU或高斯分解绝对足够我的使用! 解决方法
使用
Eigen,可以找到一个例子
here.
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |