Eigen--Matrix

本文详细介绍了Eigen库中矩阵和向量的定义、构造和操作方法,包括静态和动态大小的矩阵向量,以及如何进行赋值和重新指定大小。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在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(2,5);
    m.resize(3,4);
    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 v2();
    v.resize(5);
    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 0;
}

运行结果:
在这里插入图片描述
赋值和resize

对于动态大小的矩阵,使用操作符 = 的时候,左边的矩阵大小会根据右边的矩阵大小改变

例子如下:

#include <iostream>
#include <eigen3/Eigen/Dense>

using namespace Eigen;

int main(int argc ,char** argv)
{
    Matrix2f a(2,2);
    std::cout<<"a is of size "<<a.rows()<<"x"<<a.cols()<<std::endl;
    MatrixXf b(4,4);
    a = b;
    std::cout<<"a is now of size "<<a.rows()<<"x"<<a.cols()<<std::endl;
    
    return 0;
}

结果如下:
在这里插入图片描述
固定大小和动态大小
对于小尺寸的矩阵,使用固定大小的方式,时间开销要小的多。
  
Eigen 定义了相当多的方便使用的类型,其中还包括复数类型
MatrixNt ,VectorNt ,RowVectorNt 。
N : 2,3,4,X ;
t : i ,fd ,cf cd;

转载自:
博主:山里的小勇子
博文地址:https://www.cnblogs.com/wangxiaoyong/p/8903505.html
来源:博客园

### Eigen 3.4.0 版本介绍 Eigen 3.4.0 是一款高度优化的 C++ 线性代数库,旨在提供高效的矩阵和向量运算能力。该版本在多个方面进行了改进和技术升级,具体如下: #### 性能提升 通过对关键算法的深入优化,Eigen 3.4.0 显著提升了计算效率,特别是在处理大规模矩阵运算时表现出色。这不仅加速了数据密集型任务的速度,还增强了整体性能表现[^1]。 #### 新特性引入 新版本增加了许多新的数学函数和支持的操作,极大地拓宽了其适用范围。这些新增加的功能可以满足更为复杂的科学计算需求,使开发者能够在更广泛的领域内利用此库完成工作。 #### 稳定性增强 开发团队针对之前发现的一些问题进行了修复和完善,从而提高了整个系统的稳定性和可靠性。这种改进有助于减少程序执行过程中可能出现的各种异常情况,保障应用程序的安全运行环境。 #### 更好的C++标准兼容性 为了适应不断发展的编程语言趋势,Eigen 3.4.0 对现代 C++ 的特性和语法提供了更好的支持。这意味着使用者可以在享受最新版编译器带来的便利的同时保持良好的代码质量与易读性;同时也简化了后续维护工作的难度。 #### 文档及示例更新 官方文档得到了全面修订并加入了大量实用的例子来指导初学者快速入门以及高级用户的深入研究。完善的教程体系可以帮助用户更快地上手使用这个强大的工具集,并有效地降低学习门槛。 ```cpp // 使用Eigen求解特征值的一个简单例子 #include <iostream> #include <Eigen/Dense> using namespace std; using namespace Eigen; int main() { Matrix2f A; A << 1, 2, 3, 4; cout << "Here is the matrix A:\n" << A << endl; SelfAdjointEigenSolver<Matrix2f> eigensolver(A); if (eigensolver.info() != Success) abort(); cout << "The eigenvalues of A are:\n" << eigensolver.eigenvalues() << endl; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值