Eigen(3)矩阵Matrix及其简单操作
1. Matrix类
在Eigen,所有的矩阵和向量都是Matrix模板类的对象,Vector只是⼀种特殊的矩阵(⼀⾏或者⼀列)。
Matrix有6个模板参数,主要使⽤前三个参数,剩下的有默认值。
Matrix<typename Scalar, int RowsAtCompileTime, int ColsAtCompileTime>
Scalar是表⽰元素的类型,RowsAtCompileTime为矩阵的⾏,ColsAtCompileTime为矩阵的列。
库中提供了⼀些类型便于使⽤,⽐如:
typedef Matrix<float, 4, 4> Matrix4f;
2. Vectors向量
列向量
typedef Matrix<float, 3, 1> Vector3f;
⾏向量
typedef Matrix<int, 1, 2> RowVector2i;
3. Dynamic
Eigen不只限于已知⼤⼩(编译阶段)的矩阵,有些矩阵的尺⼨是运⾏时确定的,于是引⼊了⼀个特殊的标识符:Dynamic typedef Matrix<double, Dynamic, Dynamic> MatrixXd;
typedef Matrix<int, Dynamic, 1> VectorXi;
Matrix<float, 3, Dynamic>
4. 构造函数
默认的构造函数不执⾏任何空间分配,也不初始化矩阵的元素。
Matrix3f a;
MatrixXf b;
这⾥,a是⼀个3*3的矩阵,分配了float[9]的空间,但未初始化内部元素;b是⼀个动态⼤⼩的矩阵,定义是未分配空间(0*0)。指定⼤⼩的矩阵,只是分配相应⼤⼩的空间,未初始化元素。
MatrixXf a(10,15);
VectorXf b(30);
这⾥,a是⼀个10*15的动态⼤⼩的矩阵,分配了空间但未初始化元素;b是⼀个30⼤⼩的向量,同样分配空间未初始化元素。为了对固定⼤⼩和动态⼤⼩的矩阵提供统⼀的API,对指定⼤⼩的Matrix传递sizes也是合法的(传递也被忽略)。
Matrix3f a(3,3);
可以⽤构造函数提供4以内尺⼨的vector的初始化。
Vector2d a(5.0, 6.0);
Vector3d b(5.0, 6.0, 7.0);
Vector4d c(5.0, 6.0, 7.0, 8.0);
5. 获取元素
通过中括号获取元素,对于矩阵是:(⾏,列);对于向量,只是传递它的索引,以0为起始。
#include <iostream>
#include <Eigen/Dense>
using namespace Eigen;
int main()
{
MatrixXd m(2,2);
m(0,0) = 3;
m(1,0) = 2.5;
m(0,1) = -1;
m(1,1) = m(1,0) + m(0,1);
std::cout << "Here is the matrix m:\n" << m << std::endl;
VectorXd v(2);
v(0) = 4;
v(1) = v(0) - 1;
std::cout << "Here is the vector v:\n" << v << std::endl;
}
输出
Here is the matrix m:
3 -1
2.5 1.5
Here is the vector v:
4
3
m(index)也可以⽤于获取矩阵元素,但取决于matrix的存储顺序,默认是按列存储的,当然也可以改为按⾏。 []操作符可以⽤于向量元素的获取,但是不能⽤于matrix,因为C++中[]不能传递超过⼀个参数。
6. 逗号初始化
Matrix3f m;
m << 1, 2, 3,
4, 5, 6,
7, 8, 9;
std::cout << m;
7. resizing
matrix的⼤⼩可以通过rows()、cols()、size()获取,resize()可以重新调整动态matrix的⼤⼩。#include <iostream>
#include <Eigen/Dense>
using namespace Eigen;
int main()
{
MatrixXd m(2,5);
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(2);
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;
resize函数c++}
输出:
The matrix m is of size 4x3
It has 12 coefficients
The vector v is of size 5
As a matrix, v is of size 5x1
如果matrix的实际⼤⼩不改变,resize函数不做任何操作。resize操作会执⾏析构函数:元素的值会被改变,如果不想改变执⾏conservativeResize()。
为了统⼀API,所有的操作可⽤于指定⼤⼩的matrix,当然,实际中它不会改变⼤⼩。尝试去改变⼀个固定⼤⼩的matrix到⼀个不同的值,会出发警告失败。只有如下是合法的。
#include <iostream>
#include <Eigen/Dense>
using namespace Eigen;
int main()
{
Matrix4d m;
std::cout << "The matrix m is of size "
<< m.rows() << "x" << m.cols() << std::endl;
}
8. assignment 和 resizing
assignment(分配)是复制⼀个矩阵到另外⼀个,操作符=。Eigen会⾃动resize左变量⼤⼩等于右变量⼤⼩,⽐如:
MatrixXf a(2,2);
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论