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

时间:2013-06-04 18:46:34

标签: c++ arrays eigen

我想要做的就是实现这个功能:

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

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

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

  2. 理想情况下,我希望创建的Matrix获取数据指针的所有权,因此我可以通过shared_ptr管理Matrix,而不必再次触摸原始数据指针。

  3. 我最初的想法是,我可以做一些事情,比如创建一个未初始化的动态大小的Matrix对象,然后只设置对象的维度和数据指针,但这似乎在Eigen API中是不可能的。有没有人知道任何变通方法?

3 个答案:

答案 0 :(得分:3)

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分支(非常稳定),并使用旨在解决您确切问题的新Ref<>类等等。它的documentation应该足以正确使用它。唯一的困难是你能够轻松地模拟标量类型,因为Ref&lt;&gt;不是Matrix或Map的基类,因此您必须通过明确指定标量类型来调用您的fonction,或者创建Ref&lt;&gt;复制自己:

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

答案 1 :(得分:0)

从原始 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;
}

答案 2 :(得分:-1)

我认为解决方案就像以下一样简单:

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

默认情况下,Matrix中的数据按“列主要”排列,因此如果您希望矩阵以行主要顺序访问float **数据,则可以在赋值后转置矩阵。