通用特征 Matrix/Vector 对象传输到自定义 matrix/vector 容器
Generic Eigen Matrix/Vector object transfer to a custom matrix/vector container
所以我有一个定制的 matrix/vector 容器(为简单起见表示为 MyContainer
)适合特殊用途,并且想要实现传输 Eigen 对象(矩阵,固定,动态等..)到我的自定义容器。因此,我想创建一个类似于(用 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 可以帮助我?
将定义改成这样应该很简单:
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> >);
您可能希望将函数定义为类似 的模板。
如果您可以访问 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
可以适应几乎任何常规内存布局(步幅、column/row 专业等),只要它是单个内存块即可。
所以我有一个定制的 matrix/vector 容器(为简单起见表示为 MyContainer
)适合特殊用途,并且想要实现传输 Eigen 对象(矩阵,固定,动态等..)到我的自定义容器。因此,我想创建一个类似于(用 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 可以帮助我?
将定义改成这样应该很简单:
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> >);
您可能希望将函数定义为类似
如果您可以访问 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
可以适应几乎任何常规内存布局(步幅、column/row 专业等),只要它是单个内存块即可。