3

在 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 宏或模板元编程),以便函数更快?

编辑:我刚刚计时了以下代码(特征):

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 或高斯分解对我来说绝对足够快!

4

2 回答 2

4

使用高斯方法使矩阵成为上三角矩阵。对于每个操作,您都知道行列式是如何改变的(不改变乘以常数d)并且它在O(n^3). 之后,只需将主对角线上的数字相乘并删除所有d的乘积

于 2013-08-17T10:34:13.327 回答
3

使用Eigen,可以在此处找到示例。

于 2013-08-17T10:51:03.130 回答