[我试图在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”定义为常量,所以这不是预期的。请提供有关此行为的说明。
简单的非编译器答案是,您要让LLT解决in-place(即在传递的参数中),那么您期望的结果是什么?显然,您希望它是编译器错误,因为“就地”意味着更改参数,但是您正在传递const对象。
因此,如果我们在Eigen文档中搜索solveInPlace,我们将找到唯一一个带有const引用且具有following note的项目:
TriangularView :: solve()的“就地”版本,结果以其他形式编写
警告该参数仅标记为“ const”,以使C ++编译器在此处接受临时表达式。此函数将const_cast它,因此此处不遵守constness。
非就地选项将是:
R = myllt.solve(I);
但这并不能真正加快计算速度。无论如何,在确定需要就地选项之前,请进行基准测试。