Eigen:高效的Kronecker产品

时间:2016-08-08 22:25:08

标签: 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);

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

使用Eigen执行此操作的最快和最有效的方法是什么?

2 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:-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构造函数将使用copy construtor启动I,X,默认使用Data。

现在,只需覆盖()运算符来检查Data.Visited中的内容是否为false,并且仅在之前未计算的情况下进行多次计算。 (实现仅在使用时编译代码的想法)。