Eigen 矩阵库学习笔记
最近为了在C++中使用矩阵运算,简单学习了一下Eigen矩阵库。Eigen比Armadillo相对底层一点,但是只需要添加头文库即可使用,不使用额外的编译和安装过程。
基本定义
Matrix3f是3*3矩阵,MatrixXf表示矩阵维数不确定,MatrixXf m(3,4)表示3*4矩阵。- 'MatrixXd
是double型,MatrixXf是float`型。
列优先和行优先
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 矩阵库学习笔记的更多相关文章
- numpy, matplotlib库学习笔记
Numpy库学习笔记: 1.array() 创建数组或者转化数组 例如,把列表转化为数组 >>>Np.array([1,2,3,4,5]) Array([1,2,3,4,5]) ...
- muduo网络库学习笔记(五) 链接器Connector与监听器Acceptor
目录 muduo网络库学习笔记(五) 链接器Connector与监听器Acceptor Connector 系统函数connect 处理非阻塞connect的步骤: Connetor时序图 Accep ...
- muduo网络库学习笔记(四) 通过eventfd实现的事件通知机制
目录 muduo网络库学习笔记(四) 通过eventfd实现的事件通知机制 eventfd的使用 eventfd系统函数 使用示例 EventLoop对eventfd的封装 工作时序 runInLoo ...
- muduo网络库学习笔记(三)TimerQueue定时器队列
目录 muduo网络库学习笔记(三)TimerQueue定时器队列 Linux中的时间函数 timerfd简单使用介绍 timerfd示例 muduo中对timerfd的封装 TimerQueue的结 ...
- C++STL标准库学习笔记(三)multiset
C++STL标准库学习笔记(三)multiset STL中的平衡二叉树数据结构 前言: 在这个笔记中,我把大多数代码都加了注释,我的一些想法和注解用蓝色字体标记了出来,重点和需要关注的地方用红色字体标 ...
- 【python】numpy库和matplotlib库学习笔记
Numpy库 numpy:科学计算包,支持N维数组运算.处理大型矩阵.成熟的广播函数库.矢量运算.线性代数.傅里叶变换.随机数生成,并可与C++/Fortran语言无缝结合.树莓派Python v3默 ...
- C++STL标准库学习笔记(一)sort
前言: 近来在学习STL标准库,做一份笔记并整理好,方便自己梳理知识.以后查找,也方便他人学习,两全其美,快哉快哉! 这里我会以中国大学慕课上北京大学郭炜老师的<程序设计与算法(一)C语言程序设 ...
- 吴裕雄--天生自然Numpy库学习笔记:NumPy 矩阵库(Matrix)
import numpy.matlib import numpy as np print (np.matlib.empty((2,2))) # 填充为随机数据 numpy.matlib.zeros() ...
- GDAL库学习笔记(1):无缝拼接Google卫星图
开工之前要先了解一下瓦片地图,瓦片地图金字塔模型是一种多分辨率层次模型,从瓦片金字塔的底层到顶层,分辨率越来越低,但表示的地理范围不变.实现原理就是,首先确定地图服务平台所要提供的缩放级别的数量N,把 ...
随机推荐
- W3C验证工具
HTML验证工具:http://validator.w3.org/ CSS验证工具:http://jigsaw.w3.org/css-validator/
- JS对象基础 闭包等
一.我们知道js的基本数据类型包括:number,boolen,string,null及undefined; 看下面的一段代码: var abcobject = { firstname:" ...
- Altera DDR2 IP核学习总结2-----------DDR2 IP核的生成
打开IP核工具,然后选择Verilog HDL选项,填写路径,写入文件名DDR2_IP.V,点击next PLL reference clock frequency填入板子晶振的频率50MHZ,这里设 ...
- mariadb数据库基础
1.数据库介绍 简单的说,数据库就是一个存放数据的仓库,这个仓库是按照一定的数据结构(数据结构是指数据的组织形式或数据之间的联系)来组织,存储的,我们可以通过数据库提供的多种方法来管理数据库里的数据 ...
- 【神经网络与深度学习】如何将别人训练好的model用到自己的数据上
caffe团队用imagenet图片进行训练,迭代30多万次,训练出来一个model.这个model将图片分为1000类,应该是目前为止最好的图片分类model了. 假设我现在有一些自己的图片想进行分 ...
- 【Qt开发】Qt在QLabel(QWidget)鼠标绘制直线和矩形框
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://devbean.blog.51cto.com/448512/243546 说实话, ...
- Linux中安装配置KVM虚拟化
KVM 概述: KVM 即 Kernel-based Virtual Machine 基于内核的虚拟机. KVM,是一个开源的系统虚拟化模块,自 Linux 2.6.20 之后集成在 Linux 的各 ...
- ORACLE 使用通配符进行字符串截取
ORACLE 使用通配符进行字符串截取 select regexp_substr('aa--a(1-23),b---b(32---1)','[^(,)]+',1,1) as col1, regexp_ ...
- HDU-5201 The Monkey King
题目描述 \(m\)个猴子分\(n\)个桃,要求第一个猴子的桃数严格大于其他猴子,问有多少种分法对\(1e9+7取模(\%1e9+7)\) Input \(1≤T≤25 ,1≤n,m≤100000\) ...
- CGAL 属性配置
libgmp-10.lib libmpfr-4.lib boost_system-vc120-mt-gd-1_63.lib D:\dev\CGAL-4.9\include D:\dev\CGAL-4. ...