从C数组创建一个特征矩阵

Create an Eigen Matrix from a C array

本文关键字:一个 特征 数组 创建      更新时间:2023-10-16

我想做的就是实现这个函数:

template<typename T>
Matrix<T, Dynamic, Dynamic, ColMajor>* dataToEigen(T* const data, const int rows, const int cols);

不复制任何数据。我知道完成这类任务的标准方法是使用Map,但是我对这种方法有几个问题。

  1. 我不想重写我的其余代码来接受Map作为输入(即不将Map复制到临时矩阵中)。我知道我可以通过将我的函数泛化为将MatrixBase对象作为输入来做到这一点,但是我已经在我的输入中定义了特定的矩阵模板,这是有原因的-如果我的函数采用Matrix<T, Dynamic, Dynamic, ColMajor>,那么这是因为只有该类型的矩阵应该用作输入。

  2. 理想情况下,我希望创建的矩阵采取数据指针的所有权,这样我就可以通过shared_ptr管理矩阵,而不必再次触摸原始数据指针。

我最初的想法是,我可以做一些事情,比如创建一个未初始化的动态大小的矩阵对象,然后只是设置对象的尺寸和数据指针,但这似乎不可能在Eigen API。有人知道有什么变通办法吗?

允许Eigen::Matrix直接包装外部缓冲区的可能性很小,这有很多很好的理由,包括ABI兼容性,动态和静态分配矩阵之间的API一致性。

一个难看的解决方法是定义一个与MatrixX_:

布局相同的结构体。
template<typename T> struct Foo {
  T* data;
  DenseIndex rows, cols;
  Matrix<T, Dynamic, Dynamic, ColMajor>& asMatrix() {
    return reinterpret_cast<Matrix<T, Dynamic, Dynamic, ColMajor>&>(*this);
  }
};

另一个解决方案是转移到devel分支(相当稳定),并使用旨在解决您的确切问题的新reflt;>类,以及更多。它的文档应该足以让你正确使用它。唯一的困难是,您可以轻松地模板化标量类型,因为Ref<>不是Matrix或Map的基类,因此您必须通过显式指定标量类型来调用函数,或者自己创建Ref<>副本:

foo<T>(M);
foo(Ref<MatrixXd>(M));

从原始C/c++数组创建特征矩阵?数组的长度是由运行时决定的吗?你可以以我为例:

float dotproduct_eigen(size_t len, float* va, float* vb)
{
    Eigen::Map<Eigen::Matrix<float, 1, Eigen::Dynamic, Eigen::RowMajor>> vva(va, len);
    Eigen::Map<Eigen::Matrix<float, 1, Eigen::Dynamic, Eigen::RowMajor>> vvb(vb, len);
    float res = vva.dot(vvb);
    return res;
}

我认为解决办法如下:

float **data = new float[numRows][numCols];
MatrixXf M(numRows,numCols);
M.data() = data;

默认情况下,矩阵中的数据是有组织的Column Major,所以如果你想让你的矩阵以Row Major顺序访问float**数据,你可以在赋值后转置矩阵。