了解Eigen中的solveInPlace操作

问题描述 投票:0回答:1

[我试图在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
1个回答
0
投票

简单的非编译器答案是,您要让LLT解决in-place(即在传递的参数中),那么您期望的结果是什么?显然,您希望它是编译器错误,因为“就地”意味着更改参数,但是您正在传递const对象。

因此,如果我们在Eigen文档中搜索solveInPlace,我们将找到唯一一个带有const引用且具有following note的项目:

TriangularView :: solve()的“就地”版本,结果以其他形式编写

警告该参数仅标记为“ const”,以使C ++编译器在此处接受临时表达式。此函数将const_cast它,因此此处不遵守constness。

非就地选项将是:

R = myllt.solve(I);

但这并不能真正加快计算速度。无论如何,在确定需要就地选项之前,请进行基准测试。

© www.soinside.com 2019 - 2024. All rights reserved.