[英]I'm getting error in my c++ code! & How to find determinant and inverse of matrix in c++?
[英]How do I calculate the determinant of a 6x6 matrix in C++ really fast?
在C ++中,我需要非常快速地计算6x6矩阵的行列式。
这是我如何为2x2矩阵执行此操作:
double det2(double A[2][2]) {
return A[0][0]*A[1][1] - A[0][1]*A[1][0];
}
我想要一个6x6矩阵的行列式的类似函数,但我不想手工编写,因为它包含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宏或模板元编程),这样功能会更快?
编辑:我刚刚计时以下代码(Eigen):
Matrix<double,6,6> A;
// ... fill A
for(long i = 0; i < 1e6; i++) {
PartialPivLU< Matrix<double,6,6> > LU(A);
double d = LU.determinant();
}
到1.25秒。 所以使用LU或高斯分解绝对足够我的使用!
使用高斯方法使矩阵上三角形。 对于每个操作,您都知道决定因素是如何改变的(未改变乘以常数d
)并且它在O(n^3)
起作用。 之后,只需将主对角线上的数字相乘,然后删除所有d
的乘积
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.