Eigen学习(一)

参考:http://eigen.tuxfamily.org/dox/group__QuickRefPage.html

http://eigen.tuxfamily.org/dox/GettingStarted.html

1.简介

Eigen是有关线性代数计算的C++模板库,里面还包含了基本的矩阵、数组的定义和使用,以及矩阵的各种分解、特征值、特征向量、行列式的计算。基本涵盖了各种需要对矩阵的操作,可以说是个C++版的matlab。

模块和头文件

Eigen库被分为了一个Core模块和几个其他额外的模块,每个模块都有对应的头文件,使用时需要进行包含。其中通过Dense和Eigen头文件可以很方便的使用其他的模块,因此一般情况下使用这俩就够了。

简单的例子

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

using namespace Eigen;
using namespace std;
int main() {
    Eigen::MatrixXd m(2, 2);
    m(0, 0) = 1;
    m(0, 1) = 2;
    m(1, 0) = 3;
    m(1, 1) = 4;
    cout << m << endl;

    return 0;
}

例子解释:Eigen的头文件定义了多种类型的数据,但是当仅仅是简单的使用时,使用MatrixXd类型就够了。这个类型表示矩阵的尺寸是任意的,即每个元素都是double类型的数据。代码中首先定义了2x2的矩阵,并直接给每个元素赋值,元素的下标和数组相同,都是从0开始,程序的输出为

    1 2

    3 4

第二个例子

#include <iostream>
#include <Eigen/Dense>
using namespace Eigen;
using namespace std;
int main() {

    // Random(Index rows, Index cols);
    Eigen::MatrixXd m1 = Eigen::MatrixXd::Random(3, 3);
    // Constant(Index rows, Index cols, const Scalar& value);
    // (-1,1)+1.2 = (0.2,2.2)
    // (0.2,2.2)*50 = (10,110)
    m1 = (m1 + Eigen::MatrixXd::Constant(3, 3, 1.2)) * 50;
    cout << "m1 = " << endl << m1 << endl;
    VectorXd v(3);
    v << 1, 2, 3;
    cout << "m1*v = " << endl << m1 * v << endl;

    return 0;
}

程序中定义了一个任意尺寸的矩阵,并使用Random函数进行初始化,接着对矩阵的元素进行缩放,改变了范围,注释的部分是我猜测的,感觉应该是对的!然后定义一个有3个元素的向量,可以使用 << 输入向量的数据,之后输出了矩阵和向量相乘的结果,程序输出为

  m1 =
  94.0188  89.844 43.5223
  49.4383 101.165  86.823
  88.3099 29.7551 37.7775
  m1*v =
  404.274
  512.237

  261.153

这段代码还可以用另一种写法

#include <iostream>
#include <Eigen/Dense>
using namespace Eigen;
using namespace std;
int main() {

    Matrix3d m2 = Matrix3d::Random();
    m2 = (m2 + Matrix3d::Constant(1.2)) * 50;
    cout << "m2 =" << endl << m2 << endl;
    Vector3d v1(1, 2, 3);
    cout << "m2 * v1 =" << endl << m2 * v1 << endl;

    return 0;
}
他们实现的功能是相同的,第一种方法中矩阵和向量的尺寸是任意的,第二种是固定大小的。使用固定大小尺寸的矩阵或向量会有两点好处:首先编译更快,其次是编译器可以做更加严格的检查,比如当你用4x4的矩阵和一个3维向量相乘时,编译器会报错。
  • 4
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值