【问题标题】:Eigen: Efficient Kronecker Product特征:高效的克罗内克积
【发布时间】:2016-12-14 19:56:18
【问题描述】:

我正在将 Eigen 用于我正在进行的项目,其中运行时性能绝对是至关重要的(需要满足实时约束)。

到目前为止,Eigen 给了我相当不错的表现。但是,我需要评估 Kronecker 产品。我正在使用 Eigen 不受支持的 KroneckerProduct 模块,但我认为它不适合我的需求。

我用来计算 Kronecker 乘积的两个矩阵具有固定大小(在编译时已知)和结构。一个矩阵是正方形和对角线,让我们假设它是一个单位矩阵。另一种是小方阵。在代码中,像这样:

MatrixXf I = MatrixXf::Identity(4,4);
MatrixXf X = MatrixXf::Random(8,8);
MatrixXf P = kroneckerProduct(I,X);

由于 I 是对角线,我猜我们可以加快速度,因为我们只需要通过标量乘法计算 4 个矩阵即可计算所有元素(因为许多元素将为零)。

使用 Eigen 最快、最有效的方法是什么?

【问题讨论】:

    标签: c++ math eigen


    【解决方案1】:

    在 Eigen 3.3 beta 中,现在(不受支持)支持 sparse Kronecker products。话虽如此,如果性能很关键,我还不建议迁移到 3.3 beta。此外,如果您知道 I 是一个对角矩阵,您自己编写可能会获得更好的性能。另外,如果在编译时知道大小(并且不是太大),您可以将MatrixXf 替换为Matrix4f(固定大小,将分配在堆栈上,而不是堆上)。因此,将所有内容放在一起,您会得到:

    Matrix4f I4 = Matrix4f::Identity();
    MatrixXf P2(I4.rows() * X.rows(), I4.cols() * X.cols());
    P2.setZero();
    
    for (int i = 0; i < I4.RowsAtCompileTime; i++)
    {
        P2.block(i*X.rows(), i*X.cols(), X.rows(), X.cols()) = I4(i, i) * X;
    }
    

    【讨论】:

    • 这实际上提供了合理的加速。由于我们引用 RowsAtCompileTime,我假设编译器将能够展开该循环?除了 -march=native -mtune=native -O3(我正在使用 clang++)之外,我还应该使用哪些选项?
    • 使用RowsAtCompileTime 应该有助于编译器展开循环。从它只计算块对角线而不是整个外积的事实可以推测加速。展开的循环实际上可能对加速没有贡献。我很确定 I4.rows() 在这种情况下最终会成为相同的常数。另外,尝试将X 也设为固定大小的矩阵。
    【解决方案2】:

    我可以考虑的一个选项是创建一个继承 MatrixXf 并包含 3 个矩阵的类:I、X 和 P。 P 将是一个结构,其中包含 2 个大小为 P 的矩阵,其中一个矩阵的内容为 bool,另一个与乘积相同。

    class MatrixXfExample : public MatrixXf {
    
    MatrixXf I,X;
    MatrixXfPair Data;
    }
    
    struct MatrixXfPair {
    MatrixXf Visited,Contant;
    }
    

    MatrixXfPair 构造函数将把 Visited 初始化为 false 并单独保留 Content(默认)。

    MatrixXfExample 构造函数将使用复制构造函数初始化 I,X,并使用默认值初始化 Data。

    现在,只需重写 () 运算符,检查 Data.Visited 中的内容是否为 false,并仅在之前没有计算过的情况下进行多重计算。 (有点实现只在使用时编译代码的想法)。

    【讨论】:

    • 我不确定我是否听懂了你的意思,但这似乎并不比单纯地计算 Kronecker 积更有效......
    猜你喜欢
    • 2011-06-23
    • 2022-09-23
    • 1970-01-01
    • 2019-12-07
    • 1970-01-01
    • 2017-06-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多