Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从C数组创建特征矩阵_C++_Arrays_Eigen - Fatal编程技术网

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列);
不复制任何数据。我知道完成类似任务的标准方法是使用地图,但这种方法有几个问题

  • 我不想重写代码的其余部分以接受映射作为输入(也就是说,不将映射复制到临时矩阵中)。我知道我可以通过泛化我的函数将MatrixBase对象作为输入来实现这一点,但我在输入中定义了特定的矩阵模板是有原因的——如果我的函数采用
    矩阵
    ,那是因为只有该类型的矩阵才应该用作输入

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


  • 我最初的想法是,我可以创建一个未初始化的动态大小的矩阵对象,然后只设置对象的维度和数据指针,但这在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重载调用设置为通用版本(最干净的解决方案)。