为了灵活性,我使用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中的参数。有更好的解决方案吗?简单地分配动态到固定大小的矩阵是行不通的。
答案 0 :(得分:5)
您可以将Ref
用于此目的,它在您的情况下的用法更简单,它将为您执行运行时断言检查,例如:
MatrixXf A_dyn(4,4);
Ref<Matrix4f> A_fixed(A_dyn);
你甚至可能需要一个固定的外跨步和对齐的记忆:
Ref<Matrix4f,Aligned16,OuterStride<4> > A_fixed(A_dyn);
在这种情况下,A_fixed
非常像Matrix4f
。