我正在使用Eigen进行我正在进行的项目,其中运行时性能绝对至关重要(需要满足实时约束).
到目前为止,Eigen给了我相当不错的表现.但是,我需要评估一个Kronecker产品.我正在使用Eigen不支持的KroneckerProduct模块,但我认为它对我的需求来说并不是最理想的.
我正在计算Kronecker产品的两个矩阵具有固定大小(在编译时已知)和结构.一个矩阵是正方形和对角线,我们假设它是一个单位矩阵.另一个是一个小的方形矩阵.在代码中,像这样:
MatrixXf I = MatrixXf::Identity(4,4);
MatrixXf X = MatrixXf::Random(8,8);
MatrixXf P = kroneckerProduct(I,X);
Run Code Online (Sandbox Code Playgroud)
因为我是对角线的,所以我猜我们可以加快速度,因为我们只需要通过标量乘法来评估4个矩阵,以便计算所有元素(因为许多元素将为零).
使用Eigen的最快和最有效的方法是什么?
在Eigen 3.3 beta中,现在(不支持)支持稀疏的Kronecker产品.话虽这么说,如果性能至关重要,我还是不建议转向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;
}
Run Code Online (Sandbox Code Playgroud)