这里将解释Eigen如何与原生raw C/C++ 数组混合编程。

1. 简介

Eigen中定义了一系列的vector和matrix,相比copy数据,更一般的方式是复用数据的内存,将它们转变为Eigen类型。Map类很好地实现了这个功能。

2. Map类型

Map的定义

Map<Matrix<typename Scalar, int RowsAtCompileTime, int ColsAtCompileTime> >

默认情况下,Mao只需要一个模板参数。

为了构建Map变量,我们需要其余的两个信息:一个指向元素数组的指针,Matrix/vector的尺寸。定义一个float类型的矩阵: Map<MatrixXf> mf(pf,rows,columns); pf是一个数组指针float *。

固定尺寸的整形vector声明: Map<const Vector4i> mi(pi);

注意:Map没有默认的构造函数,你需要传递一个指针来初始化对象。

Mat是灵活地足够去容纳多种不同的数据表示,其他的两个模板参数:

Map<typename MatrixType,int MapOptions,typename StrideType>

MapOptions标识指针是否是对齐的(Aligned),默认是Unaligned。

StrideType表示内存数组的组织方式:行列的步长。

int array[8];for(int i = 0; i < 8; ++i) array[i] = i;cout << "Column-major:\n" << Map<Matrix<int,2,4> >(array) << endl;cout << "Row-major:\n" << Map<Matrix<int,2,4,RowMajor> >(array) << endl;cout << "Row-major using stride:\n" <<Map<Matrix<int,2,4>, Unaligned, Stride<1,4> >(array) << endl;

输出

Column-major:

0 2 4 6

1 3 5 7

Row-major:

0 1 2 3

4 5 6 7

Row-major using stride:

0 1 2 3

4 5 6 7

3. 使用Map变量

可以像Eigen的其他类型一样来使用Map类型。

typedef Matrix<float,1,Dynamic> MatrixType;typedef Map<MatrixType> MapType;typedef Map<const MatrixType> MapTypeConst;   // a read-only mapconst int n_dims = 5;MatrixType m1(n_dims), m2(n_dims);m1.setRandom();m2.setRandom();float *p = &m2(0);  // get the address storing the data for m2MapType m2map(p,m2.size());   // m2map shares data with m2MapTypeConst m2mapconst(p,m2.size());  // a read-only accessor for m2cout << "m1: " << m1 << endl;cout << "m2: " << m2 << endl;cout << "Squared euclidean distance: " << (m1-m2).squaredNorm() << endl;cout << "Squared euclidean distance, using map: " <<(m1-m2map).squaredNorm() << endl;m2map(3) = 7;   // this will change m2, since they share the same arraycout << "Updated m2: " << m2 << endl;cout << "m2 coefficient 2, constant accessor: " << m2mapconst(2) << endl;/* m2mapconst(2) = 5; */   // this yields a compile-time error

输出

m1:   0.68 -0.211  0.566  0.597  0.823

m2: -0.605  -0.33  0.536 -0.444  0.108

Squared euclidean distance: 3.26

Squared euclidean distance, using map: 3.26

Updated m2: -0.605  -0.33  0.536      7  0.108

m2 coefficient 2, constant accessor: 0.536

Eigen提供的函数都兼容Map对象。

4. 改变mapped数组

Map对象声明后,可以通过C++的placement new语法来改变Map的数组。

int data[] = {1,2,3,4,5,6,7,8,9};Map<RowVectorXi> v(data,4);cout << "The mapped vector v is: " << v << "\n";new (&v) Map<RowVectorXi>(data+4,5);cout << "Now v is: " << v << "\n";

The mapped vector v is: 1 2 3 4

Now v is: 5 6 7 8 9

Eigen(7)Map类相关推荐

  1. Eigen官网教程(6) Map类

    0 介绍 有时,您可能希望在Eigen中使用预定义的数字数组作为向量或矩阵.虽然一个选项是复制数据,但最常见的是您可能希望将此内存重新用作特征类型.幸运的是,使用Map类非常容易. 1 映射类型并声明 ...

  2. Eigen教程(8)之Map类

    转载于: https://www.cnblogs.com/houkai/p/6349981.html 原生缓存的接口:Map类 这篇将解释Eigen如何与原生raw C/C++ 数组混合编程. 简介 ...

  3. C++ 笔记(24)— STL map 类(map实例化、插入、查找、删除)

    1. STL 映射类简介 map 和 multimap 是键-值对容器,支持根据键进行查找,区别在于,后者能够存储重复的键,而前者只能存储唯一的键. 为了实现快速查找, STL map 和 multi ...

  4. ArcGIS API for JavaScript 入门教程[5] 再讲数据——Map类之底图与高程

    [回顾]前4篇交代了JsAPI的背景.资源如何获取,简介了数据与视图分离的概念与实现,剖析了页面的大骨架. 这篇开始,讲Map类. 转载注明出处,博客园/CSDN/B站/知乎:秋意正寒 目录:http ...

  5. java map常用类及其方法_Day50.Map类常用的方法 -Java常用类、集合#、IO

    Day50.Map类常用的方法 -Java常用类.集合#.IO Day50.Map类常用的方法 -Java常用类.集合#.IO Map类常用的方法 . 总结: 常用方法 添加: put(Object ...

  6. 使用entrySet遍历Map类集合KV,而不是keySet方式进行遍历

    使用entrySet遍历Map类集合KV,而不是keySet方式进行遍历

  7. 使用 entrySet 遍历 Map 类集合 KV ,而不是 keySet 方式进行遍历的好处

    使用 entrySet 遍历 Map 类集合 KV ,而不是 keySet 方式进行遍历. 说明: keySet 其实是遍历了 2 次,一次是转为 Iterator 对象,另一次是从 hashMap ...

  8. 【Java】Map类

    Java Map类 Map 提供了一个更通用的元素存储方法.Map 集合类用于存储元素对(称作"键"和"值"),其中每个键映射到一个值.从概念上而言,可以将 L ...

  9. 图片base64转码,本地和网络图片均可,类对象转map,类对象转键值对字符串

     1. 本地图片转换成base64 /*** 本地图片转换成base64字符串** @param imgFile 图片本地路径* @return base64字符串* @author szs* @da ...

最新文章

  1. jquery选择器玩得不6啊,只能慢慢写判断了,唉..........................
  2. ubuntu14.04 部署atlas
  3. postgresql中代理键
  4. PAT甲级1090 Highest Price in Supply Chain:[C++题解]树、结点到根结点的距离、记忆化搜索、树形dp
  5. ajax如何解决浏览器缓存问题
  6. 02ython基础知识(一)
  7. sdi转hdmi转换器应用领域及规格参数详解
  8. 关于Linux C multiple definition of‘XXX’的问题
  9. 张雁飞 mysql_张雁飞:新一代分布式关系型数据库RadonDB
  10. Torch 的安装与基本用法
  11. Python Tkinter教程–第1部分
  12. java基本运算方法总结(ing)
  13. javaweb实现教师和教室管理系统 java jsp sqlserver
  14. 西瓜视频4K修复技术还原经典,为内容创新打开新思路
  15. 图解3GPP规范文档组织结构与编号规则
  16. 海马模拟器linux,Droid4X Mac版-海马玩模拟器Mac版下载 V0.8.3Beta-PC6苹果网
  17. 经常出现正常运行Windows所需的文件已被替换成无法识别的版本
  18. java实现报数游戏
  19. TcaplusDB君 · 行业新闻汇编(三)
  20. TypeScript进阶 之 重难点梳理

热门文章

  1. mac json格式化工具_简洁好用的工具都是相似的
  2. 安卓系统双屏异显_Android 双屏异显实现的三种方式
  3. 安装win7系统不能开机启动服务器,win7系统开机启动项不能加载的原因分析及解决...
  4. python解析http数据包_如何在python中嗅探HTTP数据包?
  5. 工业交换机与工业路由器的区别
  6. 视频编解码器常见问题介绍
  7. 什么是数据光端机?数据光端机的作用有哪些?
  8. 【渝粤教育】国家开放大学2019年春季 1009离散数学(本) 参考试题
  9. [渝粤教育] 新乡医学院 医学免疫学 参考 资料
  10. 【渝粤教育】 国家开放大学2020年春季 1260软件工程 参考试题