在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类的更多相关文章

  1. (转)Qt Model/View 学习笔记 (七)——Delegate类

    Qt Model/View 学习笔记 (七) Delegate  类 概念 与MVC模式不同,model/view结构没有用于与用户交互的完全独立的组件.一般来讲, view负责把数据展示 给用户,也 ...

  2. (转)Qt Model/View 学习笔记 (五)——View 类

    Qt Model/View 学习笔记 (五) View 类 概念 在model/view架构中,view从model中获得数据项然后显示给用户.数据显示的方式不必与model提供的表示方式相同,可以与 ...

  3. Typescript 学习笔记五:类

    中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...

  4. Caliburn.Micro学习笔记(一)----引导类和命名匹配规则

    Caliburn.Micro学习笔记目录 用了几天时间看了一下开源框架Caliburn.Micro 这是他源码的地址http://caliburnmicro.codeplex.com/ 文档也写的很详 ...

  5. python cookbook第三版学习笔记十:类和对象(一)

    类和对象: 我们经常会对打印一个对象来得到对象的某些信息. class pair:     def __init__(self,x,y):         self.x=x         self. ...

  6. Java学习笔记16---抽象类与接口的浅显理解

    抽象类是由abstract修饰的类,定义方式如public abstract class A{...}. 接口由interface修饰,定义方式如public interface B{...}. 抽象 ...

  7. java学习笔记7--抽象类与抽象方法

    接着前面的学习: java学习笔记6--类的继承.Object类 java学习笔记5--类的方法 java学习笔记4--类与对象的基本概念(2) java学习笔记3--类与对象的基本概念(1) jav ...

  8. Eigen学习笔记2:C++矩阵运算库Eigen介绍

    Eigen常规矩阵定义 1.使用 Eigen的使用在官网上有详细的介绍,这里对我学习过程中用到的基本操作进行介绍.首先是矩阵的定义.在矩阵类的模板参数共有6个.一般情况下我们只需要关注前三个参数即可. ...

  9. python 学习笔记7(类/对象的属性;特性,__getattr__)

    27. 属性的__dict__系统 1)对象的属性可能来自: 其类的定义,叫做类属性 继承父类的定义 该对象实例定义(初始化对象时赋值),叫做对象属性 2)对象的属性存储在对象的 __dict__ 属 ...

随机推荐

  1. margin折叠及hasLayout && Block Formatting Contexts

    margin折叠的产生有几个条件: 这些margin都处于普通流中,并在同一个BFC中: 这些margin没有被非空内容.padding.border 或 clear 分隔开: 这些margin在垂直 ...

  2. 【数组】Product of Array Except Self

    题目: iven an array of n integers where n > 1, nums, return an array output such that output[i] is ...

  3. Postman—构建工作流

    前言 在使用“Collection Runner”的时候,集合中的请求执行顺序就是请求在Collection中的显示排列顺序.但是,有的时候我们不希望请求按照这样的方式去执行,可能是执行完第一个请求, ...

  4. 《css3揭秘》的效果code

    1.在阅读css3揭秘的基础上,跟着书中的效果组合起来的这组代码. 2.代码中有四张图片分别是 1.jpg 2.jpg  3.jpg 4.jpg; 作为demo,图片名称没有语义. 3.兼容性:  I ...

  5. 编写dimgr脚本学到的知识及技巧

    编写dimgr是为了管理手机上的镜像,在此总结下过程中学到的知识及技巧(不讨论具体用法). 参数处理 以往处理脚本参数直接用循环加判断语句,若是脚本只有简单参数,这无疑是简便可行的方法.但当需要处理复 ...

  6. Go 开发

    0.参数传递永远是值传递,地址也是一种值 1.go 开发环境的配置 2.import 包的几种形式: 1)_,默认导入一个包时,会将包中内容导入再执行包中的init()方法,有时并不需要某个包,只是想 ...

  7. 解决MySQL联表时出现字符集不一样

    mysql 建表时都会设置表的字符集和排序规则,通常是 utf8,不过我这边习惯建表的字符集是 utf8mb4,排序规则是 utf8mb4_unicode_ci.有些 utf8mb4 的表默认排序规则 ...

  8. JDK 泛型

    JDK1.5 令我们期待很久,可是当他发布的时候却更换版本号为5.0.这说明Java已经有大幅度的变化.本文将讲解JDK5.0支持的新功能-----Java的泛型. 1.Java泛型 其实Java的泛 ...

  9. lucene源码分析(1)基本要素

    1.源码包 core: Lucene core library analyzers-common: Analyzers for indexing content in different langua ...

  10. nginx 学习笔记(4) Connection处理方法

    nginx支持connection的多种处理方法.nginx运行的平台确定了可用的处理方法. 在特定平台下connection的多种处理方法中,nginx会自动选择一种最有效的方法.然而,如果需要,你 ...