1. 数组转化为Eigen::Matrix

int array[];

cout << "colMajor matrix = \n" << Map<Matrix3i>(array) << endl;                      // map a contiguous array as a column-major matrix
cout << "rowMajor matrix = \n" << Map<Matrix<int, , , RowMajor>>(array) << endl; // map a contiguous array as a row-major matrix Map<MatrixXi> eigMat1(array, , ); // eigMat1和array指向的是同一个内存空间,是绑定在一起的
MatrixXi eigMat2 = Map<MatrixXi>(array, , ); // 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 ;
} void array2eigenMat()
{
cout << "-------------------------- array2eigenMat --------------------------" << endl; int array[];
for (int i = ; i < ; ++i) array[i] = i;
cout << "array = [ "; for (int i = ; i < ; ++i) cout << array[i] << " "; cout << "]" << endl; cout << "colMajor matrix = \n" << Map<Matrix3i>(array) << endl; // map a contiguous array as a column-major matrix
cout << "rowMajor matrix = \n" << Map<Matrix<int, , , RowMajor>>(array) << endl; // map a contiguous array as a row-major matrix cout << "stride matrix = \n" << Map<MatrixXi, , OuterStride<>>(array, , , OuterStride<>()) << 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, , );
MatrixXi eigMat2 = Map<MatrixXi>(array, , );
array[] = ; cout << "eigMat1 matrix = \n"; cout << eigMat1 << endl;
cout << "eigMat2 matrix = \n"; cout << eigMat2 << endl;
cout << "---------------------------------------------------------------------" << endl; }
void eigenMat2array()
{
cout << "-------------------------- eigenMat2array --------------------------" << endl;
Matrix3d eigMat;
eigMat <<
, , ,
, , ,
, , ;
cout << "init eigMat = \n"; cout << eigMat << endl; double* eigMatptr = eigMat.data();
cout << "array = [ "; for (int i = ; i < ; ++i) cout << eigMatptr[i] << " "; cout << "]" << endl; eigMat(, ) = ;
cout << "array = [ "; for (int i = ; i < ; ++i) cout << eigMatptr[i] << " "; cout << "]" << endl; double *eigMatptrnew = new double[eigMat.size()];
Map<MatrixXd>(eigMatptrnew, eigMat.rows(), eigMat.cols()) = eigMat; eigMat(, ) = ;
cout << "init matrix = \n"; cout << eigMat << endl;
cout << "array = [ "; for (int i = ; i < ; ++i) cout << eigMatptr[i] << " "; cout << "]" << endl;
cout << "---------------------------------------------------------------------" << endl;
} void array2eigenVec()
{
cout << "-------------------------- array2eigenVec --------------------------" << endl; int array[];
for (int i = ; i < ; ++i) array[i] = i;
cout << "data array = [ "; for (int i = ; i < ; ++i) cout << array[i] << " "; cout << "]" << endl; Map<VectorXi> eigVec(array, );
cout << "eigen vector transpose = " << eigVec.transpose() << endl;
cout << "stride vector transpose = " << Map<VectorXi, , InnerStride<> >(array, ).transpose() << endl;
// map an array as a vector, specifying an inner stride, that is, the pointer increment between two consecutive coefficients array[] = ;
cout << "eigen vector transpose = " << eigVec.transpose() << endl;
cout << "stride vector transpose = " << Map<VectorXi, , InnerStride<> >(array, ).transpose() << endl; cout << "---------------------------------------------------------------------" << endl;
}
void eigenVec2array()
{
cout << "-------------------------- eigenVec2array --------------------------" << endl;
VectorXf eigvec();
eigvec << , , , , ;
cout << "eigen vector transpose = " << eigvec.transpose() << endl; float *array = new float;
array = eigvec.data();
cout << "data array = [ "; for (int i = ; i < eigvec.size(); ++i) cout << array[i] << " "; cout << "]" << endl; eigvec() = ;
cout << "data array = [ "; for (int i = ; i < eigvec.size(); ++i) cout << array[i] << " "; cout << "]" << endl; array[] = ;
cout << "eigen vector transpose = " << eigvec.transpose() << endl; cout << "---------------------------------------------------------------------" << endl;
} void vector2eigenMat()
{
cout << "-------------------------- vector2eigenMat --------------------------" << endl;
vector<int> stdvec{ , , , , , , , , };
Map<Matrix<int, , , RowMajor>> eigMat1(stdvec.data());
MatrixXi eigMat2 = Map<Matrix<int, , , RowMajor>>(stdvec.data()); cout << "eigMat1 matrix = \n"; cout << eigMat1 << endl;
cout << "eigMat2 matrix = \n"; cout << eigMat2 << endl; stdvec[] = ;
cout << "eigMat1 matrix = \n"; cout << eigMat1 << endl;
cout << "eigMat2 matrix = \n"; cout << eigMat2 << endl; cout << "---------------------------------------------------------------------" << endl;
}
void eigenMat2vector()
{
cout << "-------------------------- eigenMat2vector --------------------------" << endl;
Matrix3d eigMatCol;
eigMatCol <<
, , ,
, , ,
, , ;
cout << "eigen matrix col = \n"; cout << eigMatCol << endl;
vector<double> stdvec1(eigMatCol.data(), eigMatCol.data() + eigMatCol.size());
cout << "std vector1 = ["; for (int i = ; i < stdvec1.size(); ++i) cout << stdvec1[i] << " "; cout << "]" << endl; Matrix<double, , , RowMajor> eigMatRow = eigMatCol;
cout << "eigen matrix row = \n"; cout << eigMatCol << endl;
vector<double> stdvec2(eigMatRow.data(), eigMatRow.data() + eigMatRow.size());
cout << "std vector2 = ["; for (int i = ; i < stdvec2.size(); ++i) cout << stdvec2[i] << " "; cout << "]" << endl; cout << "---------------------------------------------------------------------" << endl;
} void vector2eigenVec()
{
cout << "-------------------------- vector2eigenVec --------------------------" << endl;
vector<int> stdvec{ , , , , };
cout << "std vector = ["; for (int i = ; 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, , InnerStride<> >(stdvec.data(), ).transpose() << endl; stdvec[] = ;
cout << "eigen vector1 transpose = " << eigVec1.transpose() << endl;
cout << "eigen vector2 transpose = " << eigVec2.transpose() << endl; cout << "stride vector transpose = " << Map<VectorXi, , InnerStride<> >(stdvec.data(), ).transpose() << endl; cout << "---------------------------------------------------------------------" << endl;
}
void eigenVec2vector()
{
cout << "-------------------------- eigenVec2vector --------------------------" << endl;
VectorXf eigvec();
eigvec << , , , , ;
cout << "eigen vector transpose = " << eigvec.transpose() << endl; vector<float> stdvec(eigvec.data(), eigvec.data() + eigvec.size());
cout << "std vector = ["; for (int i = ; i < stdvec.size(); ++i) cout << stdvec[i] << " "; cout << "]" << endl; eigvec() = ;
cout << "std vector = ["; for (int i = ; i < stdvec.size(); ++i) cout << stdvec[i] << " "; cout << "]" << endl;
cout << "---------------------------------------------------------------------" << endl;
}

程序运行结果

4. 参考

1. Eigen::Map

2. Eigen quick reference guide

3. Vlad's Blog

Eigen::Matrix与array数据转换的更多相关文章

  1. Eigen学习之Array类

    Eigen 不仅提供了Matrix和Vector结构,还提供了Array结构.区别如下,Matrix和Vector就是线性代数中定义的矩阵和向量,所有的数学运算都和数学上一致.但是存在一个问题是数学上 ...

  2. eigen Matrix详解

    Eigen Matrix 详解 在Eigen中,所有的matrices 和vectors 都是模板类Matrix 的对象,Vectors 只是一种特殊的矩阵,行或者列为1. Matrix的前三个模板参 ...

  3. numpy中的matrix与array的区别

    Numpy matrices必须是2维的,但是 numpy arrays (ndarrays) 可以是多维的(1D,2D,3D····ND). Matrix是Array的一个小的分支,包含于Array ...

  4. Numpy中matrix()和array()的区别

    matrix() 和 array() 的区别,主要从以下方面说起: 1. 矩阵生成方式不同 import numpy as np a1 = np.array([[1, 2], [3, 4]]) b1 ...

  5. Python与线性代数——Numpy中的matrix()和array()的区别

    Numpy中matrix必须是2维的,但是 numpy中array可以是多维的(1D,2D,3D····ND).matrix是array的一个小的分支,包含于array.所以matrix 拥有arra ...

  6. 73. Set Matrix Zeroes (Array)

    Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in place. Follow ...

  7. 59. Spiral Matrix II (Array)

    Given an integer n, generate a square matrix filled with elements from 1 to n2 in spiral order. For ...

  8. Joint Approximative Diagonalization of Eigen matrix (JADE)

    特征矩阵联合相似对角化算法[1]. Cardoso于1993年提出的盲信号分离具有代表性的一种算法.是一种基于四阶累积量特征矩阵近似联合对角化盲分离算法.该算法将目标函数最大化问题等价于一组四阶累积量 ...

  9. array和matrix

    array:数组 matrix:矩阵 list:列表 a = [[1,2,3],[4,5,6]] 两种array的定义方式,第一种方式可以看出list不是array,但却有很大的联系 a = np.a ...

随机推荐

  1. 基于HA机制的Nginx配置实现

    Keepalived是一个基于VRRP协议来实现服务高可用方案.下载地址:http://www.keepalived.org/ keepalived-1.2.24.tar.gz VRRP协议:虚拟路由 ...

  2. centos6 mongodb 安装

    1. 下载MongoDB 官网下载地址 https://www.mongodb.com/download-center#community 下载地址 32位 http://dl.mongodb.org ...

  3. 配置启动MySQL的Docker容器

    docker run -d -p : --name mysql -e MYSQL_ROOT_PASSWORD= mysql:

  4. PHP——判断是否为加密协议https

    前言 就是一个封装的方法,用来判断域名前面是加http还是https 代码 function is_ssl() { if(isset($_SERVER['HTTPS']) && ('1 ...

  5. 【BZOJ5506】[GXOI/GZOI2019]旅行者(最短路)

    [BZOJ5506][GXOI/GZOI2019]旅行者(最短路) 题面 BZOJ 洛谷 题解 正着做一遍\(dij\)求出最短路径以及从谁转移过来的,反过来做一遍,如果两个点不由同一个点转移过来就更 ...

  6. 帝国cms 不能正常显示最新文章

    后台能正常刷新,但前台就是不能正常显示, 把网站从c盘换到d盘,好了,原来是权限的问题

  7. Java8学习笔记(一)--Lambda表达式

    两个概念 函数式接口 函数式接口就是只显式声明一个抽象方法的接口.为保证方法数量不多不少,java8提供了一个专用注解@FunctionalInterface,这样,当接口中声明的抽象方法多于或少于一 ...

  8. 2733: [HNOI2012]永无乡 线段树合并

    题目: https://www.lydsy.com/JudgeOnline/problem.php?id=2733 题解: 建n棵动态开点的权值线段树,然后边用并查集维护连通性,边合并线段树维护第k重 ...

  9. jdk各个版本之间的差异

    背景:求职过程中,这个问题反复被问到.如果答不上来,只能说明基本功不扎实,并不能说自己擅长java. 技术趣味史-Java 各个版本的特性 Java 5 2004 年 Sun 公司发布 J2SE5(没 ...

  10. springboot中关闭eureka server中已注册服务列表自我保护配置

    配置集群服务可以向eureka通知应用是否可以使用a.在eureka server的application.properties中加入:# 设为false,关闭自我保护eureka.server.en ...