通用特征 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 专业等),只要它是单个内存块即可。