最近为了在C++中使用矩阵运算,简单学习了一下Eigen矩阵库。Eigen比Armadillo相对底层一点,但是只需要添加头文库即可使用,不使用额外的编译和安装过程。

基本定义

  • Matrix3f3*3矩阵,MatrixXf表示矩阵维数不确定,MatrixXf m(3,4)表示3*4矩阵。
  • 'MatrixXddouble型,MatrixXffloat`型。

列优先和行优先

Eigen中存储Matrix用的是column-major,但是初始化赋值的时候是row-major

Matrix3d m;
m << 1,2,3,4,5,6,7,8,9;
/* 1 2 3
4 5 6
7 8 9*/

m(3)=2,而不是4

矩阵运算

矩阵相乘:m1*m2

element-wise 相乘:m1.cwiseProduct(m2)

没有除法,但是有倒数,m1.cwiseInverse(),所以m1除m2即m1.cwiseProduct(m2.cwiseInverse())

元素操作

可以对Matrix中的所有元素使用常用函数或自定义函数进行运算,首先需要将Matrix转换为Array,例如

m1.array().sqrt()

等价于将m1矩阵中的所有元素xsqrt(x)

注意:m1.array()将矩阵m1转换成了Array,此时m1不再是矩阵,不能够和其他矩阵出现在同一个表达式中,除非是=赋值运算符。Eigen允许将一个Array赋值给Matrix,也可以将一个Matrix赋值给Array。可以使用.matrix()将Array转换回矩阵。以下面代码为例:

out = out.cwiseProduct(bn_var.array().sqrt().cwiseInverse());

上面代码会报错,因为bn_var.array().sqrt().cwiseInverse()现在是Array,而不是Matrix。正确的表达式应该是

out = out.cwiseProduct(bn_var.array().sqrt().cwiseInverse().matrix());

可以使用.unaryExpr自定义函数,

出处:https://stackoverflow.com/questions/33786662/apply-function-to-all-eigen-matrix-element @vsoftco

#include <cmath>
#include <iostream> #include <Eigen/Core> double Exp(double x) // the functor we want to apply
{
return std::exp(x);
} int main()
{
Eigen::MatrixXd m(2, 2);
m << 0, 1, 2, 3;
std::cout << m << std::endl << "becomes: ";
std::cout << std::endl << m.unaryExpr(&Exp) << std::endl;
}

从CSV中读取矩阵

函数出处:https://gist.github.com/infusion/43bd2aa421790d5b4582 @Robert Eisele

#include <iostream>
#include <fstream>
#include <Eigen/Dense> Eigen::MatrixXd readCSV(std::string file, int rows, int cols) { std::ifstream in(file); std::string line; int row = 0;
int col = 0; Eigen::MatrixXd res = Eigen::MatrixXd(rows, cols); if (in.is_open()) { while (std::getline(in, line)) { char *ptr = (char *) line.c_str();
int len = line.length(); col = 0; char *start = ptr;
for (int i = 0; i < len; i++) { if (ptr[i] == ',') {
res(row, col++) = atof(start);
start = ptr + i + 1;
}
}
res(row, col) = atof(start); row++;
} in.close();
}
return res;
}

replicate

vec.replicate(times)
mat.replicate(vertical_times, horizontal_times)
mat.colwise().replicate(vertical_times, horizontal_times)
mat.rowwise().replicate(vertical_times, horizontal_times)

Eigen 矩阵库学习笔记的更多相关文章

  1. numpy, matplotlib库学习笔记

    Numpy库学习笔记: 1.array()   创建数组或者转化数组 例如,把列表转化为数组 >>>Np.array([1,2,3,4,5]) Array([1,2,3,4,5]) ...

  2. muduo网络库学习笔记(五) 链接器Connector与监听器Acceptor

    目录 muduo网络库学习笔记(五) 链接器Connector与监听器Acceptor Connector 系统函数connect 处理非阻塞connect的步骤: Connetor时序图 Accep ...

  3. muduo网络库学习笔记(四) 通过eventfd实现的事件通知机制

    目录 muduo网络库学习笔记(四) 通过eventfd实现的事件通知机制 eventfd的使用 eventfd系统函数 使用示例 EventLoop对eventfd的封装 工作时序 runInLoo ...

  4. muduo网络库学习笔记(三)TimerQueue定时器队列

    目录 muduo网络库学习笔记(三)TimerQueue定时器队列 Linux中的时间函数 timerfd简单使用介绍 timerfd示例 muduo中对timerfd的封装 TimerQueue的结 ...

  5. C++STL标准库学习笔记(三)multiset

    C++STL标准库学习笔记(三)multiset STL中的平衡二叉树数据结构 前言: 在这个笔记中,我把大多数代码都加了注释,我的一些想法和注解用蓝色字体标记了出来,重点和需要关注的地方用红色字体标 ...

  6. 【python】numpy库和matplotlib库学习笔记

    Numpy库 numpy:科学计算包,支持N维数组运算.处理大型矩阵.成熟的广播函数库.矢量运算.线性代数.傅里叶变换.随机数生成,并可与C++/Fortran语言无缝结合.树莓派Python v3默 ...

  7. C++STL标准库学习笔记(一)sort

    前言: 近来在学习STL标准库,做一份笔记并整理好,方便自己梳理知识.以后查找,也方便他人学习,两全其美,快哉快哉! 这里我会以中国大学慕课上北京大学郭炜老师的<程序设计与算法(一)C语言程序设 ...

  8. 吴裕雄--天生自然Numpy库学习笔记:NumPy 矩阵库(Matrix)

    import numpy.matlib import numpy as np print (np.matlib.empty((2,2))) # 填充为随机数据 numpy.matlib.zeros() ...

  9. GDAL库学习笔记(1):无缝拼接Google卫星图

    开工之前要先了解一下瓦片地图,瓦片地图金字塔模型是一种多分辨率层次模型,从瓦片金字塔的底层到顶层,分辨率越来越低,但表示的地理范围不变.实现原理就是,首先确定地图服务平台所要提供的缩放级别的数量N,把 ...

随机推荐

  1. jenkins提示反向代理设置有误

    jenkins提示反向代理设置有误 参照地址 https://www.cnblogs.com/yhleng/p/7594892.html 分析:是junkins的url地址填错了 解决: 系统管理-- ...

  2. Oracle中 ORA-12704:字符集不匹配

    前言 在使用Union all连接时,若A集合中某列为nvarchar2或nvarchar类型,而B集合中无此列,用‘ ’ 来代替是会报字符集不匹配 1 select '中国','China',cas ...

  3. 用番茄工作法提升工作效率 (四)ToDoList的持续优化

    一.写在前面 前面三篇文章,系统介绍了我如何使用番茄工作法,并结合“自制”的桌面ToDoList工具来实现自己的任务管理. 自制ToDoList的初衷是自我管理,但是好友看到我的桌面(程序)后,建议我 ...

  4. windows OS安全配置【持续更新20190618】

    https://www.52stu.org/?p=76 来源:5号暗区 5号黯区 五号黯区 5号暗区 windows系统的一些加固方法等 关闭445端口: REG ADD HKLM\SYSTEM\Cu ...

  5. vue-cli3.0使用及部分配置详解

    1.检测安装   vue-V 2.创建项目命令:(官网) 3.简单的配置信息 这里如果你是第一次用3.0版本的话,是没有前两个的,而只有最后两个,这里是 让你选的,第一个是默认配置,一般选第二个,自己 ...

  6. python 生成器、三元表达式、列表推倒式、字典生成式、生成器表达式(总结)

    1.生成器 def func(): yield g = func() next(g) x = yield 2.三元表达式 res = x if 条件 else y 3.列表推导式,字典生成式,生成器表 ...

  7. Elasticsearch-使用映射来定义各种文档

    ES-使用映射来定义各种文档 每篇文档属于一种类型,而每种类型属于一个索引.从数据的逻辑划分来看,可以认为索引是数据库,而类型是数据库中的表.类型包含了映射中每个字段的定义.映射包括了该类型的文档中可 ...

  8. python-day1(学前了解)

    Markdown基本语法 各级标题 # 一级标题 ## 二级标题 ### 三级标题 #### 四级标题 ##### 五级标题 加粗 **加粗文本** 斜体 *我斜了* 高亮 ==我高亮了== 上标 2 ...

  9. layer.prompt绑定确认键

    case 'eventkc': top.layer.prompt({ formType: , title: '修改<span style="color:red">' + ...

  10. c#获取网络时间

    public static DateTime GetInternetDate()        {            var client = new TcpClient("time.n ...