zoukankan      html  css  js  c++  java
  • Eigen::Matrix与array数据转换

    1. 数组转化为Eigen::Matrix

    int array[9];
    
    cout << "colMajor matrix = 
    " << Map<Matrix3i>(array) << endl;                      // map a contiguous array as a column-major matrix
    cout << "rowMajor matrix = 
    " << Map<Matrix<int, 3, 3, RowMajor>>(array) << endl;   // map a contiguous array as a row-major matrix
    
    Map<MatrixXi>  eigMat1(array, 3, 3);                     // eigMat1和array指向的是同一个内存空间,是绑定在一起的
    MatrixXi       eigMat2 = Map<MatrixXi>(array, 3, 3);    //  eigMat1和array指向不同的内存空间,互不影响

    2. Eigen::Matrix转化为数组

    Matrix3d eigMat;
    
    double* eigMatptr = eigMat.data();
    double* eigMatptrnew = new double[eigMat.size()];
    Map<MatrixXd>(eigMatptrnew, eigMat.rows(), eigMat.cols()) = eigMat;

    3.更多转化

    下面的代码是我写的互相转化的测试

    #include <iostream>
    #include <vector>
    #include <Eigen/Dense>
    
    using namespace std;
    using namespace Eigen;
    
    void array2eigenMat();
    void eigenMat2array();
    
    void array2eigenVec();
    void eigenVec2array();
    
    void vector2eigenMat();
    void eigenMat2vector();
    
    void vector2eigenVec();
    void eigenVec2vector();
    
    
    int main()
    {
        cout << "hello world" <<endl;
        array2eigenMat();
        eigenMat2array();
    
        array2eigenVec();
        eigenVec2array();
    
        vector2eigenMat();
        eigenMat2vector();
    
        vector2eigenVec();
        eigenVec2vector();
        return 0;
    }
    
    void array2eigenMat()
    {
        cout << "-------------------------- array2eigenMat  --------------------------" << endl;
        
        int array[9];
        for (int i = 0; i < 9; ++i) array[i] = i;
        cout << "array = [ "; for (int i = 0; i < 9; ++i) cout << array[i] << " "; cout << "]" << endl;
    
        cout << "colMajor matrix = 
    " << Map<Matrix3i>(array) << endl;                     // map a contiguous array as a column-major matrix
        cout << "rowMajor matrix = 
    " << Map<Matrix<int, 3, 3, RowMajor>>(array) << endl;  // map a contiguous array as a row-major matrix
    
    
        cout << "stride matrix = 
    " << Map<MatrixXi, 0, OuterStride<>>(array, 3, 3, OuterStride<>(2)) << endl;
        //mapping an array while specifying an outer stride. Here, since we're mapping as a column-major matrix, 
        // 'outer stride' means the pointer increment between two consecutive columns
    
    
        Map<MatrixXi> eigMat1(array, 3, 3); 
        MatrixXi      eigMat2 = Map<MatrixXi>(array, 3, 3);
        array[0] = 9;
    
        cout << "eigMat1 matrix = 
    "; cout << eigMat1 << endl;
        cout << "eigMat2 matrix = 
    "; cout << eigMat2 << endl;
        cout << "---------------------------------------------------------------------" << endl;
    
    }
    void eigenMat2array()
    {
        cout << "-------------------------- eigenMat2array  --------------------------" << endl;
        Matrix3d eigMat;
        eigMat << 
            1, 2, 3,
            4, 5, 6,
            7, 8, 9;
        cout << "init eigMat = 
    ";    cout << eigMat << endl;
    
        double* eigMatptr = eigMat.data();
        cout << "array = [ "; for (int i = 0; i < 9; ++i) cout << eigMatptr[i] << " "; cout << "]" << endl;
    
        eigMat(0, 0) = 9;
        cout << "array = [ "; for (int i = 0; i < 9; ++i) cout << eigMatptr[i] << " "; cout << "]" << endl;
    
    
        double *eigMatptrnew = new double[eigMat.size()];
        Map<MatrixXd>(eigMatptrnew, eigMat.rows(), eigMat.cols()) = eigMat;
        
        eigMat(2, 2) = 0;
        cout << "init matrix = 
    "; cout << eigMat << endl;
        cout << "array = [ "; for (int i = 0; i < 9; ++i) cout << eigMatptr[i] << " "; cout << "]" << endl;
        cout << "---------------------------------------------------------------------" << endl;
    }
    
    void array2eigenVec()
    {
        cout << "-------------------------- array2eigenVec  --------------------------" << endl;
    
        int array[9];
        for (int i = 0; i < 9; ++i) array[i] = i;
        cout << "data array = [ "; for (int i = 0; i < 9; ++i) cout << array[i] << " "; cout << "]" << endl;
    
        Map<VectorXi> eigVec(array, 5);
        cout << "eigen  vector transpose = " << eigVec.transpose() << endl;
        cout << "stride vector transpose = " << Map<VectorXi, 0, InnerStride<2> >(array, 4).transpose() << endl;
        // map an array as a vector, specifying an inner stride, that is, the pointer increment between two consecutive coefficients
    
        array[0] = 9;
        cout << "eigen  vector transpose = " << eigVec.transpose() << endl;
        cout << "stride vector transpose = " << Map<VectorXi, 0, InnerStride<2> >(array, 4).transpose() << endl;
    
        cout << "---------------------------------------------------------------------" << endl;
    }
    void eigenVec2array()
    {
        cout << "-------------------------- eigenVec2array  --------------------------" << endl;
        VectorXf eigvec(5);
        eigvec << 0, 1, 2, 3, 4;
        cout << "eigen  vector transpose = " << eigvec.transpose() << endl;
    
        float *array = new float;
        array = eigvec.data();
        cout << "data array = [ "; for (int i = 0; i < eigvec.size(); ++i) cout << array[i] << " "; cout << "]" << endl;
        
        eigvec(0) = 9;
        cout << "data array = [ "; for (int i = 0; i < eigvec.size(); ++i) cout << array[i] << " "; cout << "]" << endl;
    
        array[0] = 5;
        cout << "eigen  vector transpose = " << eigvec.transpose() << endl;
    
        cout << "---------------------------------------------------------------------" << endl;
    }
    
    void vector2eigenMat()
    {
        cout << "-------------------------- vector2eigenMat --------------------------" << endl;
        vector<int> stdvec{ 1, 2, 3, 4, 5, 6, 7, 8, 9 };
        Map<Matrix<int, 3, 3, RowMajor>> eigMat1(stdvec.data());
        MatrixXi                         eigMat2 = Map<Matrix<int, 3, 3, RowMajor>>(stdvec.data());
    
        cout << "eigMat1 matrix = 
    "; cout << eigMat1 << endl;
        cout << "eigMat2 matrix = 
    "; cout << eigMat2 << endl;
    
        stdvec[0] = 9;
        cout << "eigMat1 matrix = 
    "; cout << eigMat1 << endl;
        cout << "eigMat2 matrix = 
    "; cout << eigMat2 << endl;
    
        cout << "---------------------------------------------------------------------" << endl;
    }
    void eigenMat2vector()
    {
        cout << "-------------------------- eigenMat2vector --------------------------" << endl;
        Matrix3d eigMatCol;
        eigMatCol << 
            1, 2, 3,
            4, 5, 6,
            7, 8, 9;
        cout << "eigen matrix col = 
    ";    cout << eigMatCol << endl;
        vector<double> stdvec1(eigMatCol.data(), eigMatCol.data() + eigMatCol.size());
        cout << "std   vector1 = ["; for (int i = 0; i < stdvec1.size(); ++i) cout << stdvec1[i] << " "; cout << "]" << endl;
    
        Matrix<double, 3, 3, RowMajor> eigMatRow = eigMatCol;
        cout << "eigen matrix row = 
    ";    cout << eigMatCol << endl;
        vector<double> stdvec2(eigMatRow.data(), eigMatRow.data() + eigMatRow.size());
        cout << "std   vector2 = ["; for (int i = 0; i < stdvec2.size(); ++i) cout << stdvec2[i] << " "; cout << "]" << endl;
    
        cout << "---------------------------------------------------------------------" << endl;
    }
    
    void vector2eigenVec()
    {
        cout << "-------------------------- vector2eigenVec --------------------------" << endl;
        vector<int> stdvec{ 1, 2, 3, 4, 5 };
        cout << "std   vector = ["; for (int i = 0; i < stdvec.size(); ++i) cout << stdvec[i] << " "; cout << "]" << endl;
    
        Map<VectorXi> eigVec1(stdvec.data(), stdvec.size());
        VectorXi eigVec2 = Map<VectorXi>(stdvec.data(), stdvec.size());
        cout << "eigen  vector1 transpose = " << eigVec1.transpose() << endl;
        cout << "eigen  vector2 transpose = " << eigVec2.transpose() << endl;
        cout << "stride vector  transpose = " << Map<VectorXi, 0, InnerStride<2> >(stdvec.data(), 2).transpose() << endl;
    
    
        stdvec[0] = 9;
        cout << "eigen  vector1 transpose = " << eigVec1.transpose() << endl;
        cout << "eigen  vector2 transpose = " << eigVec2.transpose() << endl;
    
        cout << "stride vector  transpose = " << Map<VectorXi, 0, InnerStride<2> >(stdvec.data(), 2).transpose() << endl;
    
        cout << "---------------------------------------------------------------------" << endl;
    }
    void eigenVec2vector()
    {
        cout << "-------------------------- eigenVec2vector --------------------------" << endl;
        VectorXf eigvec(5);
        eigvec << 0, 1, 2, 3, 4;
        cout << "eigen  vector transpose = " << eigvec.transpose() << endl;
    
        vector<float> stdvec(eigvec.data(), eigvec.data() + eigvec.size());
        cout << "std   vector = ["; for (int i = 0; i < stdvec.size(); ++i) cout << stdvec[i] << " "; cout << "]" << endl;
    
        eigvec(0) = 5;
        cout << "std   vector = ["; for (int i = 0; i < stdvec.size(); ++i) cout << stdvec[i] << " "; cout << "]" << endl;
        cout << "---------------------------------------------------------------------" << endl;
    }

    程序运行结果

    2017-12-14_141655

    4. 参考

    1. Eigen::Map

    2. Eigen quick reference guide

    3. Vlad's Blog

  • 相关阅读:
    js格式化文件大小,单位:Bytes、KB、MB、GB
    Java如何大批量从json数据源中按指定符号隔字符串,并修改、删除数据
    ExtJs定时消息提示框,类似于QQ右下角提示,ExtJs如何定时向后台发出两个请求并刷新数据实例
    Java jxl导入excel文件,导入的数字、身份证号码、手机号变成了科学计数法,解决方案
    Java 防SQL注入过滤器(拦截器)代码
    mysql8源码安装和MGR
    linux基础
    ThreadLocal
    redis缓存雪崩、穿透、击穿概念及解决办法
    ThreadLocal可能引起的内存泄露
  • 原文地址:https://www.cnblogs.com/VVingerfly/p/8037490.html
Copyright © 2011-2022 走看看