通用特征矩阵/向量对象传输到自定义矩阵/向量容器

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 可以适应几乎任何常规内存布局(步幅、列/行主要等),只要它是单个内存块。

【讨论】:

以上是关于通用特征矩阵/向量对象传输到自定义矩阵/向量容器的主要内容,如果未能解决你的问题,请参考以下文章

线性代数精华——矩阵的特征值与特征向量

解决抽象矩阵向量以及抽象矩阵方程问题的一些技巧

线性代数---矩阵---特征值和特征向量

矩阵——特征向量(Eigenvector)

雅可比算法求矩阵的特征值和特征向量

线性代数之特征值和特征向量