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. 二、IIS部署WebApi

    一.项目发布 二.hosts 更改 C:\Windows\System32\drivers\etc 三.网站搭建 之后我将端口默认更改 8001   以防与80端口冲突 注意: 1.先测试IIS的lo ...

  2. LDOOP ADD_PRINT_TEXT多页项

    纯文本打印(ADD_PRINT_TEXT)项超过宽度且高度不够的情况下,不会隐藏后面的内容,而是会分到下一页.分页数量和每页显示内容多少 和设置的纯文本打印项高度有关.LODOP.SET_PRINT_ ...

  3. hdu-5786(补图最短路)

    题意:给你n个点,m条无向边,问你这n个点构成的完全图,不用那m条边,由一个s出现的单源最短路 解题思路:首先,暴力建图不行,点太多,那么我们就按照它的规则来,把m条边建好,但是建的这个图表示不走的方 ...

  4. linux 定时下载github最新代码

    场景:网站的代码在github上托管,静态网站部署在服务器上,每次自己修改完本地代码后,提交到github上,需要自己去服务器上执行git pull 拉取最新代码, 为了解决这种操作,自己再服务器上  ...

  5. CAN总线报文浅析

    CAN的报文格式 在总线中传送的报文,每帧由7部分组成.CAN协议支持两种报文格式,其唯一的不同是标识符(ID)长度不同,标准格式为11位,扩展格式为29位. 在标准格式中,报文的起始位称为帧起始(S ...

  6. pytest 11 allure2生成html报告

    allure是一个report框架,支持java的Junit/testng等框架,当然也可以支持python的pytest框架,也可以集成到Jenkins上展示高大上的报告界面. 环境准备 1.pyt ...

  7. 数字化IT人才与组织

    企业的数字化目标 数字时代需要怎样的IT 数字化平台战略 产品一体化交付能力 产品设计与规划的能力 路线图 数字人才框架 Tips: 赋能授权(Empowerment)是近年来应最多的商业语汇之一.赋 ...

  8. 液晶流在齐次 Besov 空间中的正则性准则

    在 [Zhang, Zujin. Regularity criteria for the three dimensional Ericksen–Leslie system in homogeneous ...

  9. [物理学与PDEs]第1章习题15 媒介中电磁场的电磁动量密度向量与电磁动量流密度张量

    对媒质中的电磁场, 推导其电磁动量密度向量及电磁动量流密度张量的表达式 (7. 47) 及 (7. 48). 解答: 由 $$\beex \bea \cfrac{\rd}{\rd t}\int_\Om ...

  10. linux内存 free命令 buffer cache作用

    free命令用于查看linux内存使用情况 #free shared:用于进程之间相互共享数据. Used:已使用内存. total:内存总量. free:未使用的内存. available:开启一个 ...