【发布时间】:2020-01-02 23:33:18
【问题描述】:
我在 Eigen3.3.7 中使用 LLT 以加速我的应用程序中的矩阵逆计算时试图探索“solveInPlace()”函数的选项。 我用下面的代码测试了一下。
int main()
{
const int M=3;
Eigen::Matrix<MyType,Eigen::Dynamic,Eigen::Dynamic> R = Eigen::Matrix<MyType,Eigen::Dynamic,Eigen::Dynamic>::Zero(M,M);
// to make sure full rank
for(int i=0; i<M*2; i++)
{
const Eigen::Matrix<MyType, Eigen::Dynamic,1> tmp = Eigen::Matrix<MyType,Eigen::Dynamic,1>::Random(M);
R += tmp*tmp.transpose();
}
std::cout<<"R \n";
std::cout<<R<<std::endl;
decltype (R) R0 = R; // saving for later comparison
Eigen::LLT<Eigen::Ref<Eigen::Matrix<MyType,Eigen::Dynamic,Eigen::Dynamic> > > myllt(R);
const Eigen::Matrix<MyType,Eigen::Dynamic,Eigen::Dynamic> I = Eigen::Matrix<MyType,Eigen::Dynamic,Eigen::Dynamic>::Identity(R.rows(), R.cols());
myllt.solveInPlace(I);
std::cout<<"I: "<<I<<std::endl;
std::cout<<"Prod InPlace: \n"<<R0*I<<std::endl;
return 0;
}
阅读 Eigen 文档后,我认为输入矩阵(此处为“R”)将在计算变换时进行修改。令我惊讶的是,我发现结果存储在“I”中。这是意料之外的,因为我将“I”定义为常数。请对此行为作出解释。
【问题讨论】:
标签: eigen eigen3 matrix-inverse