通用特征矩阵/矢量对象转移到自定义矩阵/矢量容器

问题描述

因此,我有一个适合特殊用途的定制矩阵/向量容器(为简单起见用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可以帮助我吗?

解决方法

应该简单地将定义更改为此:

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> >);
,

您可能希望将函数定义为模板,例如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可以适应几乎所有常规的内存布局(步长,列/行主要等),只要它是单个内存块即可。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...