我想要做的就是实现这个功能:
template<typename T>
Matrix<T, Dynamic, Dynamic, ColMajor>* dataToEigen(T* const data, const int rows, const int cols);
不复制任何数据。我知道完成这样的事情的标准方法是使用Map,但我对这种方法有几个问题。
我不想重写我的其余代码来接受Maps作为输入(不将Map复制到临时矩阵中)。我知道我可以通过概括我的函数来将MatrixBase对象作为输入来实现这一点,但我在输入中定义了特定的Matrix模板是有原因的 - 如果我的函数需要Matrix<T, Dynamic, Dynamic, ColMajor>
,那么因为只有矩阵类型应该用作输入。
理想情况下,我希望创建的Matrix获取数据指针的所有权,因此我可以通过shared_ptr管理Matrix,而不必再次触摸原始数据指针。
我最初的想法是,我可以做一些事情,比如创建一个未初始化的动态大小的Matrix对象,然后只设置对象的维度和数据指针,但这似乎在Eigen API中是不可能的。有没有人知道任何变通方法?
答案 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 **数据,则可以在赋值后转置矩阵。