将动态矩阵转换为 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<float, 3, Eigen::Dynamic> 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 中的固定矩阵的主要内容,如果未能解决你的问题,请参考以下文章