Eigen快速入门

Eigen快速入门

一个简单的例子

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

using namespace std;
using Eigen::MatrixXd;


void fun0()
{
      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);
      cout<<m<<endl;
}
  • Eigen头文件定义了许多类型,对于简单的应用来说使用MatrixXd就足够
  • 它代表任意大小的矩阵,X代表此意,其中的每一个元素都是double
  • 参照快速参考指引查看其它类型
  • Eigen/Dense头文件中包含了MatrixXd中所有成员函数的定义和相关类型
  • 定义在该头文件中的所有类和函数,还有其它头文件中的,都位于Eigen命名空间
  • 第一行声明MatrixXd变量,并指明行数和列数,元素没有被初始化
  • 设置左上角元素为3,你需要小括号来引用该元素
  • 索引都是从0开始
  • 紧接着三行设置其它三个值,最后输出该矩阵

Dense头文件中包含的内容:

#include "Core"
#include "LU"
#include "Cholesky"
#include "QR"
#include "SVD"
#include "Geometry"
#include "Eigenvalues"

矩阵个向量

运行时设置大小

void fun1()
{
    MatrixXd m=MatrixXd::Random(3,3);
    m=(m+MatrixXd::Constant(3,3,1.2))*50;
    cout<<"m="<<endl;
    cout<<m<<endl;
    Eigen::VectorXd v(3);
    v<<1,2,3;
    cout<<"v:"<<endl;
    cout<<v<<endl;
    cout<<"m*v="<<endl<<m*v<<endl;

}
  • 这个例子声明了一个3*3的矩阵,并且使用Random()进行初始化
  • 第二行使用现行变换将值限制在10到110之间
  • MatrixXd::Constant(3,3,1.2)生成一个3*3的矩阵,所有元素都是1.2
  • 引入了一个新的类型,VectorXd,代表任意大小的向量,它声明包含三个元素,没有初始化
  • 使用都好初始化器进行初始化
  • 矩阵m和向量v相乘并输出结果

编译时设置大小


void fun2()
{
    Eigen::Matrix3d m=Eigen::Matrix3d::Random();
    m=(m+Eigen::Matrix3d::Constant(1.2))*50;
    cout<<"m="<<endl;
    cout<<m<<endl;
    Eigen::Vector3d v(1,2,3);
    cout<<"v:"<<endl;
    cout<<v<<endl;
    cout<<"m*v="<<endl<<m*v<<endl;
}
  • 这个版本和上一个类似,只是使用Matrix3d代表固定大小的矩阵
  • 它本身就代表这指定大小,所以构造函数中不需要指定大小
  • 类似我们使用Vector3d来代替VectorXd

两种情况对比

  • 固定大小的矩阵和向量具有两大优势
  • 编译器释放出更快的代码,因为它知道矩阵和向量的大小
  • 指定大小会在编译时候进行严格的检验,例如 Matrix4d 和Vector3d相乘,编译器会报错
  • 然而,使用许多类型会增加编译时间,和可执行应用的大小。而且,在编译时候矩阵大小有可能还不确定。
  • 根据经验,对于4*4或者更小的矩阵使用固定大小的类型
#ifndef FUNCTION_H_ #define FUNCTION_H_ #include #include #include "polyfit.h" #include using namespace std; dxs::dxs() { ifstream fin("多项式拟合.txt"); fin>>n; x=new float[n]; y=new float[n]; for(int i=0;i>x[i]; } for(i=0;i>y[i]; } cout<>nn; m=nn+1; u=new float*[m]; for(i=0;i<m;i++) { u[i]=new float[m+1]; }//创建m行,m+1列数组 } void dxs::dfine() { for(int i=0;i<m;i++) { for(int j=0;j<m+1;j++) { u[i][j]=0; } } for(i=0;i<m;i++) { for(int j=0;j<m;j++) { for(int k=0;k<n;k++) { u[i][j]=u[i][j]+pow(x[k],j+i); } } } for(i=0;i<m;i++) { for(int k=0;k<n;k++) { u[i][m]=u[i][m]+pow(x[k],i)*y[k]; } } } void dxs::show() { for(int i=0;i<m;i++) { for(int j=0;j<m+1;j++) { cout<<u[i][j]<<" ";//<<endl; } cout<<endl; } ////显示具有m行m+1列u数组的各元素值 } void dxs::select_main(int k,float **p,int m) { double d; d=*(*(p+k)+k); //cout<<d; int l=k; int i=k+1; for(;i fabs(d)) { d=*(*(p+i)+k); l=i; } else continue; } if(d==0) cout<<"错误"; else { if(k!=l) { for(int j=k;j<m+1;j++) { double t; t=*(*(p+l)+j); *(*(p+l)+j)=*(*(p+k)+j); *(*(p+k)+j)=t; } } } } void dxs::gaosi() { for(int k=0;k<m;k++) { select_main(k,u,m);//调用列主元函数 for(int i=1+k;i<m;i++) { // *(*(p+i)+k)=(float) *(*(p+i)+k) / *(*(p+k)+k); u[i][k]=(float) u[i][k] / u[k][k]; } for(i=k+1;i<m;i++) { for(int j=k+1;j=0;i--) { float a=0; for(int j=i+1;j<m;j++) { //a=a + (*(*(p+i)+j) * *(*(p+j)+m)); a=a+u[i][j] * u[j][m]; } //*(*(p+i)+n-1)= (*(*(p+i)+n-1) - a) / *(*(p+i)+i); u[i][m]= (u[i][m] -a) / u[i][i]; } cout<<"方程组的解为:"<<endl; for(i=0;i<m;i++) { cout<<"a"<<i+1<<"="; cout<<u[i][m]<<endl; // l[i]=*(*(p+i)+n-1); } cout<<"y="<<u[0][m]; for(i=1;i<m;i++) { cout<<showpos<<u[i][m]<<"x"; if(i!=1)cout<<"^"<<noshowpos<<i; } cout<<endl; } dxs::~dxs() { delete[]x,y; delete []*u; } #endif
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值