通用特征矩阵/向量对象传输到自定义矩阵/向量容器
Posted
技术标签:
【中文标题】通用特征矩阵/向量对象传输到自定义矩阵/向量容器【英文标题】:Generic Eigen Matrix/Vector object transfer to a custom matrix/vector container 【发布时间】:2020-08-26 09:27:49 【问题描述】:所以我有一个定制的矩阵/向量容器(为简单起见表示为MyContainer
)适合特殊用途,并希望实现将特征对象(矩阵、固定、动态等)的数据传输到我的自定义容器。因此我想创建一个类似于(用 Eigen::MatrixXd 说明)的函数
template<class T>
void assign_eigen_object(MyContainer<T> &lhs, const Eigen::MatrixXd &rhs)
int n_rows = rhs.rows(), n_cols = rhs.cols();
lhs.resize(n_rows, n_cols);
for (int i = 0; i < n_rows; i++)
for (int j = 0; j < n_cols; j++)
lhs(i, j) = (T)rhs(i, j);
是否可以创建一个考虑所有特征类型(浮动动态矩阵、双动态矩阵、浮动固定矩阵、浮动部分固定矩阵等)的模板化函数?还是我需要重载相关对象的功能?也许 Eigen::Map 可以帮助我?
【问题讨论】:
【参考方案1】:应该很简单,只要把定义改成这样:
template<class T, typename TEigenType>
void assign_eigen_object(MyContainer<T> &lhs, const TEigenType &rhs)
...
但是,使用 MyContainer
的正确内存布局,您可能会做得更好,并用单个 std::copy
替换嵌套循环。
编辑:
您可能还想添加类似的内容以避免可能的误用。我不完全确定它是否适用于所有特征类型:
static_assert(std::is_same_v<std::decay_t<T>,
std::decay_t<typename TEigenType::value_type> >);
【讨论】:
【参考方案2】:您可能希望将函数定义为Benny K's answer 之类的模板。
如果您有权访问MyContainer
(例如MyContainer::data()
)的原始存储,则可以使用Eigen::Map
进行实施。像这样的:
Eigen::Map<Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>> lhs_map(lhs.data(), n_rows, n_cols);
lhs_map = rhs.cast<T>();
Eigen::Map
可以适应几乎任何常规内存布局(步幅、列/行主要等),只要它是单个内存块。
【讨论】:
以上是关于通用特征矩阵/向量对象传输到自定义矩阵/向量容器的主要内容,如果未能解决你的问题,请参考以下文章