将动态矩阵转换为 Eigen 中的固定矩阵

Posted

技术标签:

【中文标题】将动态矩阵转换为 Eigen 中的固定矩阵【英文标题】:Cast dynamic matrix to fixed matrix in Eigen 【发布时间】:2017-06-06 17:54:47 【问题描述】:

为了灵活性,我使用 C++ 库 Eigen 将数据加载到动态大小的矩阵(例如 Eigen::MatrixXf)中。我编写了一些需要混合或固定大小矩阵作为参数的函数(例如Eigen::Matrix<float, 3, Eigen::Dynamic>Eigen::Matrix4f)。假设我对行和列大小做了正确的断言,我如何将动态矩阵(在运行时设置的大小)转换为固定矩阵(在编译时设置的大小)?

我能想到的唯一解决方案就是映射它,例如:

Eigen::MatrixXf dyn = Eigen::MatrixXf::Random(3, 100);
Eigen::Matrix<float, 3, Eigen::Dynamic> fixed = 
    Eigen::Map<float, 3, Eigen::Dynamic>(dyn.data(), 3, dyn.cols());

但我不清楚这是否可行,因为固定大小的映射构造函数不接受行和列作为the docs 中的参数。有更好的解决方案吗?简单地将动态矩阵分配给固定大小的矩阵是行不通的。

【问题讨论】:

使用动态大小以获得灵活性,然后强制转换为固定大小来调用函数听起来很矛盾。你真的需要输入是动态大小吗?我的意思是无论如何你的函数似乎需要一定的大小...... @tobi303:原因是我对不同的数据集合使用相同的加载器函数。然后,根据我加载的数据,我调用需要混合或固定大小作为参数的处理函数(由于 typedefs) 是的,这应该可以。并不是说在最近的版本中(至少从 3.2.9 开始),您应该能够在不使用 Eigen::Map 的情况下做到这一点。 不确定您尝试了什么,但Eigen::Matrix&lt;float, 3, Eigen::Dynamic&gt; fixed = dyn; 应该可以正常工作。如果没有,请添加您在编写本文时遇到的错误。但是,此转换确实会导致复制所有系数(这可能不是您想要的)。 【参考方案1】:

您可以为此目的使用Ref,它在您的情况下的使用更简单,它会为您执行运行时断言检查,例如:

MatrixXf A_dyn(4,4);
Ref<Matrix4f> A_fixed(A_dyn);

您甚至可能需要一个固定的外跨步和对齐的内存:

 Ref<Matrix4f,Aligned16,OuterStride<4> > A_fixed(A_dyn);

在这种情况下,A_fixed 真的很像Matrix4f

【讨论】:

以上是关于将动态矩阵转换为 Eigen 中的固定矩阵的主要内容,如果未能解决你的问题,请参考以下文章

将特征矩阵转换为无符号字符 *

OpenCV矩阵与Eigen矩阵相互转换

将固定大小的特征矩阵作为参数传递给调用动态大小矩阵的函数

cv::Mat 转换为特征矩阵并返回

避免使用 Eigen 分解稀疏矩阵时的动态内存分配

g2oEigenMat矩阵类型转换