C++ 从C数组创建特征矩阵
我想做的主要是实现这个功能:C++ 从C数组创建特征矩阵,c++,arrays,eigen,C++,Arrays,Eigen,我想做的主要是实现这个功能: template<typename T> Matrix<T, Dynamic, Dynamic, ColMajor>* dataToEigen(T* const data, const int rows, const int cols); 模板 矩阵*dataToEigen(T*const数据、const int行、const int列); 不复制任何数据。我知道完成类似任务的标准方法是使用地图,但这种方法有几个问题 我不想重写代码的其余
template<typename T>
Matrix<T, Dynamic, Dynamic, ColMajor>* dataToEigen(T* const data, const int rows, const int cols);
模板
矩阵*dataToEigen(T*const数据、const int行、const int列);
不复制任何数据。我知道完成类似任务的标准方法是使用地图,但这种方法有几个问题
矩阵
,那是因为只有该类型的矩阵才应该用作输入我最初的想法是,我可以创建一个未初始化的动态大小的矩阵对象,然后只设置对象的维度和数据指针,但这在Eigen API中似乎是不可能的。有人知道任何解决方法吗?允许Eigen::Matrix直接包装外部缓冲区的可能性很小,原因很多,包括ABI兼容性、跨动态和静态分配矩阵的API一致性 一个难看的解决方法是定义一个与MatrixX\ux布局相同的结构:
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);
}
};
模板结构Foo{
T*数据;
登盛指数行,科尔斯;
矩阵&asMatrix(){
返回重新解释的铸件(*本);
}
};
另一个解决方案是转移到devel分支(相当稳定),并使用新的类来解决您的确切问题,等等。它应该足以正确使用它。唯一的困难是您能够轻松地模板化标量类型,因为Ref不是矩阵或映射的基类,因此您必须通过显式指定标量类型来调用函数,或者自己创建Ref副本:
foo<T>(M);
foo(Ref<MatrixXd>(M));
foo(M);
foo(参考文献(M));
我认为解决方案很简单,如下所示:
float **data = new float[numRows][numCols];
MatrixXf M(numRows,numCols);
M.data() = data;
默认情况下,矩阵中的数据是按列主顺序组织的,因此如果希望矩阵按行主顺序访问浮点**数据,可以在赋值后转置矩阵。从原始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-dotproduct\u-eigen(大小长度、浮点*va、浮点*vb)
{
本征::映射vva(va,len);
本征::映射vvb(vb,len);
浮点数=vva.dot(vvb);
返回res;
}
您丑陋的解决方案似乎是最简单的解决方案,但这不是相当危险吗?我现在不太担心实际编译的代码是可移植的,但是有没有保证Foo和模板化的MatrixX最终会有相同的内存安排?至于第二个选项,听起来我可以重写我的方法,使其看起来像:模板void Foo(const Ref),这将允许它们同时接受矩阵和映射输入?内存布局是有保证的(不同Egeng版本之间的ABI兼容性)。是的,这就是如何使用它。问题是,当使用模板参数部分定义时,它不太方便,因为矩阵或映射不继承Ref,因此不允许编译器隐式实例化正确的模板参数。因此,您要么显式地提供它,要么显式地转换为Ref,或者如果您只关心2或3个标量类型,您还可以将2-3重载调用设置为通用版本(最干净的解决方案)。