在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. Spring Security构建Rest服务-1001-spring social开发第三方登录之spring social基本原理

    OAuth协议是一个授权协议,目的是让用户在不将服务提供商的用户名密码交给第三方应用的条件下,让第三方应用可以有权限访问用户存在服务提供商上的资源. 接着上一篇说的,在第三方应用获取到用户资源后,如果 ...

  2. Spring中的BeanPostProcessor

    一.何谓BeanProcessor BeanPostProcessor是SpringFramework里非常重要的核心接口之一,我先贴出一段源代码: /* * Copyright 2002-2015 ...

  3. 拦截并记录数据库操作-Logging and Intercepting Database Operations

    原文:http://msdn.microsoft.com/zh-cn/data/dn469464 Logging and Intercepting Database Operations Starti ...

  4. centos下kubernetes+flannel部署(旧)

    更合理的部署方式参见<Centos下Kubernetes+Flannel部署(新)> 一.准备工作 1. 三台centos主机 k8s(即kubernetes,下同)master: 10. ...

  5. elasticsearch(二) 之 elasticsearch安装

    目录 elasticsearch 安装与配置 安装java 安装elastcsearch 二进制安装(tar包) 在进入生产之前我们必须要考虑到以下设置 增大打开文件句柄数量 禁用虚拟内存 合适配置的 ...

  6. springboot-9-在springboot中引入bean

    在非spring管理的包中引入spring管理的类, 可以使用一个类继承ApplicationContextAware即可 分两种, 第一种该类在spring的包扫描范围之下: package com ...

  7. Markdown编辑器-图形化

    SELECT * from yffee_favourable_detail yfd LEFT JOIN yffee_favourable yf on yfd.minor_id = yf.major_i ...

  8. 基于Java的简易表达式解析工具(二)

    之前简单的介绍了这个基于Java表达式解析工具,现在把代码分享给大家,希望帮助到有需要的人们,这个分享代码中依赖了一些其他的类,这些类大家可以根据自己的情况进行导入,无非就是写字符串处理工具类,日期处 ...

  9. 手机浏览器_安卓_苹果手机Webview 中唤醒APP

    Url scheme是iOS,Android平台都支持,只需要原生APP开发时注册scheme, 那么用户点击到此类链接时,会自动跳到APP.比如 <!-- 打开考拉APP首页 --> & ...

  10. Node.js之Express三

    端午节3天说没就没了,自己的脚伤都快一个月了还没好,原本想着去桂林或者厦门呢,可计划赶不上变化,看自己公司C#软件工程师的招聘条件有要求MongoDb,年前就打算自己学习下,买的这本书就叫Node.j ...