Eigen学习笔记2-Matrix类
在Eigen中,所有的矩阵Matrix和向量Vector都是由Matrix类构造的。向量只不过是矩阵的特殊形式,只有一列(列向量)或者一行。
Matrix模板类有6个参数,其中前三个参数是必须的。前三个参数如下:
Matrix<typename Scalar,int RowsAtCompileTime,int ColsAtCompileTime >
Scalar 是 标量类型,取值可以是 float ,int double 等。
RowsAtCompileTime 和 ColsAtCompileTime 是在程序编译时就已经知道的矩阵的行数和列数。
Eigen 提供了一些常用的 定义好的类型。比如:
typedef Matrix<float,4,4> Matrix4f .
在Eigen中,列向量是默认向量,在不特别说明的情况下,向量Vector就是指的列向量。在Eigen中定义了列向量:
typedef Matrix<float,3,1> Vector3f ;
Eigen也定义了行向量:
typedef Matrix<int ,1,2 > RowVector2i ;
如果矩阵的尺寸在编译的时候是不确定的,而在运行的时候才能确定,Eigen提供了定义动态大小的方法。比如非常好用的:
typedef Matrix<double ,Dynamic,Dynamic > MatrixXd;
MatrixXd定义了任意行数和列数的矩阵,可以在运行时确定。
类似地,对于向量有:
typedef Matrix<int ,Dynamic ,1> VectorXi ;
也可以对于一个维度确定,而指定另外一个维度是动态大小的。
Matrix<float,3,Dynamic> 矩阵的行数是 3,列数不确定。
矩阵的构造,Eigen提供了默认构造函数。
Matrix3f a;
MatirxXf b;
a 是一个3 x 3的矩阵,每个元素都是未初始化的float。
b 目前是一个 0 x 0 的矩阵。
带参数的构造函数,对于矩阵,行数在列数前面,对于向量,只有向量的大小。
MatrixXf a(10,15);
VectorXf b(30);
a 是一个 10 x 15的动态大小的矩阵,分配了内存但是没有初始化。
b 是一个动态大小的向量,大小是30,分配了内存但是没有初始化。
对于维度在 4 以下的矩阵和向量,都定义了固定大小的类型。
例如可以使用,
Vector2d ; Vector3d ; Vector4d; 等来定义向量。
Matrix2f ;Matrix3f ; Matrix4f ; 等定义矩阵。
可以使用逗号初始化方式给矩阵和向量赋值。例如:
Matrix3f m;
m << 1,2,3,
4,5,6,
7,8,9;
这样就将上述值赋给了矩阵,在Eigen中矩阵默认的存储方式是行优先,就是先存储行。
Eigen支持对动态大小的矩阵和向量重新指定大小。
rows() , cols() , size() 分别返回行数,列数和 元素的个数。
resize() 则可以重新指定矩阵大小。
实例如下;
#include <iostream>
#include <eigen3/Eigen/Dense> using namespace Eigen; int main(int argc ,char** argv)
{
MatrixXd m(,);
m.resize(,);
std::cout<<"The matrix m is of size "
<<m.rows()<<" x "<<m.cols()<<std::endl;
std::cout<<"It has"<<m.size()<<" coefficients"<<std::endl; VectorXd v(;
v.resize(;
std::cout<<"The vector v is of size "<<v.size()<<std::endl;
std::cout<<"As a matrix, v is of size "
<<v.rows()<<" x "<<v.cols()<<std::endl; return ;
}
运行结果:
赋值和resize
对于动态大小的矩阵,使用操作符 = 的时候,左边的矩阵大小会根据右边的矩阵大小改变。
例如:
#include <iostream>
#include <eigen3/Eigen/Dense> using namespace Eigen; int main(int argc ,char** argv)
{
Matrix2f a(,);
std::cout<<"a is of size "<<a.rows()<<"x"<<a.cols()<<std::endl;
MatrixXf b(,);
a = b;
std::cout<<"a is now of size "<<a.rows()<<"x"<<a.cols()<<std::endl; return ;
}
运行结果如下:
固定大小和动态大小
对于小尺寸的矩阵,使用固定大小的方式,时间开销要小的多。
Eigen 定义了相当多的方便使用的类型,其中还包括复数类型。
MatrixNt ,VectorNt ,RowVectorNt 。
N : 2,3,4,X ;
t : i ,f d ,cf cd.
Eigen学习笔记2-Matrix类的更多相关文章
- (转)Qt Model/View 学习笔记 (七)——Delegate类
Qt Model/View 学习笔记 (七) Delegate 类 概念 与MVC模式不同,model/view结构没有用于与用户交互的完全独立的组件.一般来讲, view负责把数据展示 给用户,也 ...
- (转)Qt Model/View 学习笔记 (五)——View 类
Qt Model/View 学习笔记 (五) View 类 概念 在model/view架构中,view从model中获得数据项然后显示给用户.数据显示的方式不必与model提供的表示方式相同,可以与 ...
- Typescript 学习笔记五:类
中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...
- Caliburn.Micro学习笔记(一)----引导类和命名匹配规则
Caliburn.Micro学习笔记目录 用了几天时间看了一下开源框架Caliburn.Micro 这是他源码的地址http://caliburnmicro.codeplex.com/ 文档也写的很详 ...
- python cookbook第三版学习笔记十:类和对象(一)
类和对象: 我们经常会对打印一个对象来得到对象的某些信息. class pair: def __init__(self,x,y): self.x=x self. ...
- Java学习笔记16---抽象类与接口的浅显理解
抽象类是由abstract修饰的类,定义方式如public abstract class A{...}. 接口由interface修饰,定义方式如public interface B{...}. 抽象 ...
- java学习笔记7--抽象类与抽象方法
接着前面的学习: java学习笔记6--类的继承.Object类 java学习笔记5--类的方法 java学习笔记4--类与对象的基本概念(2) java学习笔记3--类与对象的基本概念(1) jav ...
- Eigen学习笔记2:C++矩阵运算库Eigen介绍
Eigen常规矩阵定义 1.使用 Eigen的使用在官网上有详细的介绍,这里对我学习过程中用到的基本操作进行介绍.首先是矩阵的定义.在矩阵类的模板参数共有6个.一般情况下我们只需要关注前三个参数即可. ...
- python 学习笔记7(类/对象的属性;特性,__getattr__)
27. 属性的__dict__系统 1)对象的属性可能来自: 其类的定义,叫做类属性 继承父类的定义 该对象实例定义(初始化对象时赋值),叫做对象属性 2)对象的属性存储在对象的 __dict__ 属 ...
随机推荐
- margin折叠及hasLayout && Block Formatting Contexts
margin折叠的产生有几个条件: 这些margin都处于普通流中,并在同一个BFC中: 这些margin没有被非空内容.padding.border 或 clear 分隔开: 这些margin在垂直 ...
- 【数组】Product of Array Except Self
题目: iven an array of n integers where n > 1, nums, return an array output such that output[i] is ...
- Postman—构建工作流
前言 在使用“Collection Runner”的时候,集合中的请求执行顺序就是请求在Collection中的显示排列顺序.但是,有的时候我们不希望请求按照这样的方式去执行,可能是执行完第一个请求, ...
- 《css3揭秘》的效果code
1.在阅读css3揭秘的基础上,跟着书中的效果组合起来的这组代码. 2.代码中有四张图片分别是 1.jpg 2.jpg 3.jpg 4.jpg; 作为demo,图片名称没有语义. 3.兼容性: I ...
- 编写dimgr脚本学到的知识及技巧
编写dimgr是为了管理手机上的镜像,在此总结下过程中学到的知识及技巧(不讨论具体用法). 参数处理 以往处理脚本参数直接用循环加判断语句,若是脚本只有简单参数,这无疑是简便可行的方法.但当需要处理复 ...
- Go 开发
0.参数传递永远是值传递,地址也是一种值 1.go 开发环境的配置 2.import 包的几种形式: 1)_,默认导入一个包时,会将包中内容导入再执行包中的init()方法,有时并不需要某个包,只是想 ...
- 解决MySQL联表时出现字符集不一样
mysql 建表时都会设置表的字符集和排序规则,通常是 utf8,不过我这边习惯建表的字符集是 utf8mb4,排序规则是 utf8mb4_unicode_ci.有些 utf8mb4 的表默认排序规则 ...
- JDK 泛型
JDK1.5 令我们期待很久,可是当他发布的时候却更换版本号为5.0.这说明Java已经有大幅度的变化.本文将讲解JDK5.0支持的新功能-----Java的泛型. 1.Java泛型 其实Java的泛 ...
- lucene源码分析(1)基本要素
1.源码包 core: Lucene core library analyzers-common: Analyzers for indexing content in different langua ...
- nginx 学习笔记(4) Connection处理方法
nginx支持connection的多种处理方法.nginx运行的平台确定了可用的处理方法. 在特定平台下connection的多种处理方法中,nginx会自动选择一种最有效的方法.然而,如果需要,你 ...