【发布时间】:2020-11-09 12:55:56
【问题描述】:
我使用 C++ 14 和 Eigen,我想使用 LU 分解来计算方阵的行列式。 (link) 但我有一些问题:A 是主矩阵(n 大小),rez 是 A 的 LU 形式。
PartialPivLU<MatrixXd> rez = PartialPivLU<MatrixXd>(A);
MatrixXd r1 = rez.matrixLU().triangularView<UpLoType::Upper>();
double det_r1 = 1;
for(int i=0;i<n;i++)
det_r1 = det_r1 * r1(i,i);
cout<<det_r1<<endl;
cout<<A.determinant();
r1 的行列式是主对角线元素的乘积。问题是 det(A) 不等于 det(r1)。
例如 det(A) = 500 和 det(r1) = -500。问题是关于 r1 的符号,我怎样才能得到符号?
【问题讨论】:
-
rez.determinant()呢? -
我需要使用主对角线元素的乘积来计算行列式
-
由于您可以访问排列的索引,因此您可以计算此排列是奇数还是偶数
-
@dacian 这就是 Eigen 在内部做的事情。但它也会跟踪排列的数量,因此也能正确计算符号(只需检查源代码以了解发生了什么)。
-
计算排列的奇偶性需要一点努力,例如查看循环的长度。你可以在这里找到一些信息:en.wikipedia.org/wiki/Parity_of_a_permutation
标签: c++ linear-algebra eigen determinants matrix-factorization