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.
最新文章
- linux命令在线手册
- VS中逻辑文件夹与实际文件夹
- phpstorm常用功能&;快捷键(mac)
- Apache日志按天切割
- sublime中让成对括号高亮显示的设置步骤
- php 删除一段字符串的中的中文
- easyui textarea回车导致datagrid 数据无法展示的问题
- CSUST 1503 ZZ买衣服
- Codeforces Round #339 Div.2 A - Link/Cut Tree
- javascript给不能修改的函数增加额外处理的方法
- iOS 数组里面取字典的值
- cdoj 847 方老师与栈 火车进出战问题
- LeetCode OJ 之 Ugly Number II (丑数-二)
- docker小结
- css-preprocessors
- javaIO缓冲区
- leetcode 121 买卖股票的最佳时机
- C语言编程学习不难学,是你没找对方法!
- 51nod 1244 莫比乌斯函数之和 【杜教筛】
- SSH 基于ajax实现修改密码功能步骤梳理