使用PartialPivLU进行LU分解

时间:2017-07-05 16:45:22

标签: c++ matlab eigen3 matlab-to-eigen

我在MatLab中有以下代码,在尝试计算'lamb'之前进行LU分解,我已经将其包括在内以提供一些上下文。

P=[1,2,3;4,5,6;7,8,9];
U=[0;1;2];
[F,J]=lu(P);
Jlamda=F\U;
lamb=J\Jlamda;

F是:

0.142857142857143   1                   0
0.571428571428571 0.500000000000000 1
1 0 0

你是:

7                  8                   9
0 0.857142857142857 1.71428571428571
0 0 1.11022302462516e-16

当我尝试使用以下代码在Eigen中复制它时:

MatrixXd P(3, 3);
P << 1, 2, 3, 4, 5, 6, 7, 8, 9;
MatrixXd U(3, 1);
U << 0, 1, 2;

PartialPivLU<MatrixXd> lu = PartialPivLU<MatrixXd>(P);
MatrixXd J = lu.matrixLU().triangularView<UpLoType::Upper>();
MatrixXd F = lu.matrixLU().triangularView<UpLoType::UnitLower>();

MatrixXd Jlamda = F.lu().solve(U);
MatrixXd l = J.lu().solve(Jlamda);

cout << F << endl;
cout << endl;
cout << J << endl;

打印:

1                    0                  0
0.142857 1 0
0.571429 0.5 1
7                    8                  9
0 0.857143 1.71429
0 0 1.11022e-16

虽然我可以显然手工制作一个矩阵来将C ++中的F行转换为MatLab中的F行,但我不确定如何动态地执行此操作。

PartialPivLU是解决这个问题的最好办法,还是我错过了一些更微不足道的事情?

提前致谢。

2 个答案:

答案 0 :(得分:4)

通过调用[F,J]=lu(P),生成的矩阵F置换的下三角矩阵。您可以将该函数调用为[F,J,perm]=lu(P)以接收F作为真正的下三角矩阵,并P作为单独的置换矩阵,以便F*J = perm*P。默认情况下,行

MatrixXd F = lu.matrixLU().triangularView<UpLoType::UnitLower>();

使用Eigen返回真正的下三角矩阵。如果你想要像Matlab这样的置换下三角矩阵返回,那么你可以通过调用permutationP然后将这个矩阵乘以F来将置换矩阵存储在Eigen中。

答案 1 :(得分:1)

DCSmith的答案非常接近,但似乎你必须在置换矩阵上调用transpose()才能得到正确的结果:

i

打印:

0 1 0
0 0 1
1 0 0
0.142857 1 0
0.571429 0.5 1
1 0 0

与MatLab示例

相同