gpt4 book ai didi

c++ - 使用 PartialPivLU 进行 LU 分解

转载 作者:行者123 更新时间:2023-11-30 01:07:16 25 4
gpt4 key购买 nike

我在 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 是解决此问题的最佳方法,还是我遗漏了一些更微不足道的东西?

最佳答案

调用 [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 将置换矩阵存储在 Eigen 中。然后将该矩阵乘以 F .

关于c++ - 使用 PartialPivLU 进行 LU 分解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44931857/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com