Eigen::Matrix与array数据转换
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数据转换的更多相关文章
- Eigen学习之Array类
Eigen 不仅提供了Matrix和Vector结构,还提供了Array结构.区别如下,Matrix和Vector就是线性代数中定义的矩阵和向量,所有的数学运算都和数学上一致.但是存在一个问题是数学上 ...
- eigen Matrix详解
Eigen Matrix 详解 在Eigen中,所有的matrices 和vectors 都是模板类Matrix 的对象,Vectors 只是一种特殊的矩阵,行或者列为1. Matrix的前三个模板参 ...
- numpy中的matrix与array的区别
Numpy matrices必须是2维的,但是 numpy arrays (ndarrays) 可以是多维的(1D,2D,3D····ND). Matrix是Array的一个小的分支,包含于Array ...
- Numpy中matrix()和array()的区别
matrix() 和 array() 的区别,主要从以下方面说起: 1. 矩阵生成方式不同 import numpy as np a1 = np.array([[1, 2], [3, 4]]) b1 ...
- Python与线性代数——Numpy中的matrix()和array()的区别
Numpy中matrix必须是2维的,但是 numpy中array可以是多维的(1D,2D,3D····ND).matrix是array的一个小的分支,包含于array.所以matrix 拥有arra ...
- 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 ...
- 59. Spiral Matrix II (Array)
Given an integer n, generate a square matrix filled with elements from 1 to n2 in spiral order. For ...
- Joint Approximative Diagonalization of Eigen matrix (JADE)
特征矩阵联合相似对角化算法[1]. Cardoso于1993年提出的盲信号分离具有代表性的一种算法.是一种基于四阶累积量特征矩阵近似联合对角化盲分离算法.该算法将目标函数最大化问题等价于一组四阶累积量 ...
- array和matrix
array:数组 matrix:矩阵 list:列表 a = [[1,2,3],[4,5,6]] 两种array的定义方式,第一种方式可以看出list不是array,但却有很大的联系 a = np.a ...
随机推荐
- vhdl when else
在VHDL中,IF...THEN...ELSE是顺序语句,只能出现在行为描述中(进程体或者子程序中):而WHEN...ELSE是并行语句,可以直接出现在结构体中,但却不能出现在行为描述中.WHEN.. ...
- 一个".java"源文件中是否可以包括多个类
可以有多个类,但只能有一个public的类,并且public的类名必须与文件名相一致. 现在我们编个测试文件来测试一番(一个程序员要具有用于探索的精神 -.- 手动滑稽) 1.编写一个 a ...
- Python 正则处理_re模块
正则表达式 动机 文本处理成为计算机常见工作之一 对文本内容搜索,定位,提取是逻辑比较复杂的工作 为了快速方便的解决上述问题,产生了正则表达式技术 定义 文本的高级匹配模式, 提供搜索, 替换, 本质 ...
- git 操作命令详解
git 什么是git 开源的分布式版本控制系统, 用于高效的管理大小项目和文件 代码管理工具 防止代码丢失, 做备份 代码版本管控, 设置节点, 多版本切换 建立分支各自开发, 互不影响, 方便合并 ...
- 满汉全席[2-SAT]
题面 对不起我又写了一个板题qvq 和洛谷那道模板题没区别...两样菜至少做一样即可 不过注意define和函数的区别!!! #include <cmath> #include <c ...
- django restframework permission
与 authentication 和 throttling 一起,permission 决定是应该接受还是拒绝访问请求.权限检查总是在视图的最开始处运行,在任何其他代码被允许进行之前.权限检查通常会使 ...
- 深入理解PHP的运行模式
PHP运行模式有4钟:1)cgi 通用网关接口(Common Gateway Interface))2) fast-cgi 常驻 (long-live) 型的 CGI3) cli 命令行运行 ( ...
- Vue(小案例_vue+axios仿手机app)_上拉加载
---恢复内容开始--- 一.前言 ...
- uImage
linux内核经过编译后会生成一个ELF格式的可执行程序,叫vmlinux或vmlinuz,是原始的未经任何处理加工的原版内核ELF文件:嵌入式系统烧录的一般不是这个vmlinuz/vmlinux,而 ...
- Python中如何设置输出文字的颜色
一.语法 1.实现过程 终端的字符颜色是用转义序列控制的,是文本模式下的系统显示功能,和具体的语言无关.控制字符颜色的转义序列是以ESC开头,即用\033来完成 2.书写过程 开头部分: \033 ...