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. 基于scrapy-redis的分布式爬虫

    一.介绍 1.原生的scrapy框架 原生的scrapy框架是实现不了分布式的,其原因有: 1. 因为多台机器上部署的scrapy会各自拥有各自的调度器,这样就使得多台机器无法分配start_urls ...

  2. Luogu5290 十二省联考2019春节十二响(贪心+启发式合并)

    考虑链的做法,显然将两部分各自从大到小排序后逐位取max即可,最后将根计入.猜想树上做法相同,即按上述方式逐个合并子树,最后加入根.用multiset启发式合并即可维护.因为每次合并后较小集合会消失, ...

  3. dl,dt,dd标签的使用

    dl就是定义一个列表 dt说明白了就是这个列表的标题dd就是内容,能缩进和UL,OL性质差不多 <dl> <dt>标题标题</dt> <dd>内容内容& ...

  4. dajngo cache,throttling

    缓存 背景介绍: 动态网站的问题就在于它是动态的. 也就是说每次用户访问一个页面,服务器要执行数据库查询,启动模板,执行业务逻辑以及最终生成一个你所看到的网页,这一切都是动态即时生成的. 从处理器资源 ...

  5. OSU! on tree

    dsu on tree 好吧,这个毒瘤...... 树剖和启发式合并的杂合体. 用于解决静态子树问题,复杂度O(nlogn * insert时间) 因为dsu是并查集的意思所以算法名字大概就是什么树上 ...

  6. grovvy身份证(全)

    import java.text.DecimalFormat import java.text.SimpleDateFormat import java.util.Calendar; import j ...

  7. SPFA+SLF+LLL

    关于SLF优化 朴素SPFA使用常规队列(FIFO)更新距离,并没有考虑优化出队顺序(dis值小的优先出队)可以在一开始就把各个点的dis值限值小,从而避免大量的松弛操作,从而提高效率.这就是SLF( ...

  8. command not found

    1.问题(problem) #wget gzip.x86_64 0:1.5-10.el7 -bash: wget command not found 2.解决(solution) 两个都能用 yum ...

  9. table 表格固定表头和第一列、内容可滚动

    整理了下: <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" c ...

  10. [译]Ocelot - Getting Started

    原文 Ocelot专为.NET Core而设计. .NET Core 2.1 安装 首先需要创建一个netstandard2.0项目,然后再通过nuget安装. Install-Package Oce ...