c++ - Eigen :高效克罗内克积

标签 c++ math eigen

我正在将 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 执行此操作最快、最有效的方法是什么?

最佳答案

在 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;
}

关于c++ - Eigen :高效克罗内克积,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38839406/

相关文章:

c++ - OpenGL 新纹理在删除后替换旧纹理

c++ - Eigen C++ 中的逐列点积

c++ - Eigen 乘法断言失败

c++ - 特征中的 typedef 与类中的 typedef

c++ - 使用代码 :Blocks on Linux 的 C++ 函数中的 "Not Declared in scope"

c++ - 在嵌套 vector C++ 中获取特定元素

C++ 迭代器问题

Java创建螺旋

math - 这里写的 R 符号是什么意思?

c++ - 优雅地上下数