有关eigen库的一些基本使用方法

目录

  • 介绍
    • 安装
    • Demo
    • 矩阵、向量初始化
      • C++数组和矩阵转换
      • 矩阵基础操作
      • 点积和叉积
      • 转置、伴随、行列式、逆矩阵
      • 计算特征值和特征向量
      • 解线性方程
      • 最小二乘求解
      • 稀疏矩阵

介绍

Eigen是一个轻量级的矩阵库,除了稀疏矩阵不成熟(3.1有较大改进)以外,其他的矩阵和向量操作都比较完善,而且速度不错.

不支持vc6.0,vs最低版本支持2003(打补丁),最好是2005以上.

安装

在eigen 3.1.3下载最新的版本,然后解压文件,将解压出来的文件夹下的\\Eigen\文件夹拷贝到程序文件夹下,包括头文件,即可使用

Demo

eigendemo.zip

示例是vs2010环境下的程序,主要的文件就只有main.cpp和Eigen文件夹。

矩阵、向量初始化

#include <iostream>
#include "Eigen/Dense"
using namespace Eigen;
int main()
{MatrixXf m1(3,4);   //动态矩阵,建立3行4列。MatrixXf m2(4,3);	//4行3列,依此类推。MatrixXf m3(3,3);Vector3f v1;		//若是静态数组,则不用指定行或者列/* 初始化 */Matrix3d m = Matrix3d::Random();m1 = MatrixXf::Zero(3,4);		//用0矩阵初始化,要指定行列数m2 = MatrixXf::Zero(4,3);m3 = MatrixXf::Identity(3,3);	//用单位矩阵初始化v1 = Vector3f::Zero();			//同理,若是静态的,不用指定行列数m1 << 1,0,0,1,		//也可以以这种方式初始化1,5,0,1,0,0,9,1;m2 << 1,0,0,0,4,0,0,0,7,1,1,1;//向量初始化,与矩阵类似Vector3d v3(1,2,3);VectorXf vx(30);
}

C++数组和矩阵转换

使用Map函数,可以实现Eigen的矩阵和c++中的数组直接转换,语法如下:

//@param MatrixType 矩阵类型
//@param MapOptions 可选参数,指的是指针是否对齐,Aligned, or Unaligned. The default is Unaligned.
//@param StrideType 可选参数,步长
/*Map<typename MatrixType,int MapOptions,typename StrideType>
*/int i;//数组转矩阵double *aMat = new double[20];for(i =0;i<20;i++){aMat[i] = rand()%11;}//静态矩阵,编译时确定维数 Matrix<double,4,5> Eigen:Map<Matrix<double,4,5> > staMat(aMat);//输出for (int i = 0; i < staMat.size(); i++)std::cout << *(staMat.data() + i) << " ";std::cout << std::endl << std::endl;//动态矩阵,运行时确定 MatrixXdMap<MatrixXd> dymMat(aMat,4,5);//输出,应该和上面一致for (int i = 0; i < dymMat.size(); i++)std::cout << *(dymMat.data() + i) << " ";std::cout << std::endl << std::endl;//Matrix为列优先,如下返回指针dymMat.data();

矩阵基础操作

eigen重载了基础的+ - * / += -= *= /= *可以表示标量和矩阵或者矩阵和矩阵

#include <iostream>
#include <Eigen/Dense>
using namespace Eigen;
int main()
{//单个取值,单个赋值double value00 = staMat(0,0);double value10 = staMat(1,0);staMat(0,0) = 100;std::cout << value00 <<value10<<std::endl;std::cout <<staMat<<std::endl<<std::endl;//加减乘除示例 Matrix2d 等同于 Matrix<double,2,2>Matrix2d a;a << 1, 2,3, 4;MatrixXd b(2,2);b << 2, 3,1, 4;Matrix2d c = a + b;std::cout<< c<<std::endl<<std::endl;c = a - b;std::cout<<c<<std::endl<<std::endl;c = a * 2;std::cout<<c<<std::endl<<std::endl;c = 2.5 * a;std::cout<<c<<std::endl<<std::endl;c = a / 2;std::cout<<c<<std::endl<<std::endl;c = a * b;std::cout<<c<<std::endl<<std::endl;

点积和叉积

#include <iostream>
#include <Eigen/Dense>
using namespace Eigen;
using namespace std;
int main()
{//点积、叉积(针对向量的)Vector3d v(1,2,3);Vector3d w(0,1,2);std::cout<<v.dot(w)<<std::endl<<std::endl;std::cout<<w.cross(v)<<std::endl<<std::endl;
}
*/

转置、伴随、行列式、逆矩阵

小矩阵(4 * 4及以下)eigen会自动优化,默认采用LU分解,效率不高

#include <iostream>
#include <Eigen/Dense>
using namespace std;
using namespace Eigen;
int main()
{Matrix2d c;c << 1, 2,3, 4;//转置、伴随std::cout<<c<<std::endl<<std::endl;std::cout<<"转置\n"<<c.transpose()<<std::endl<<std::endl;std::cout<<"伴随\n"<<c.adjoint()<<std::endl<<std::endl;//逆矩阵、行列式std::cout << "行列式: " << c.determinant() << std::endl;std::cout << "逆矩阵\n" << c.inverse() << std::endl;
}

计算特征值和特征向量

#include <iostream>
#include <Eigen/Dense>
using namespace std;
using namespace Eigen;
int main()
{//特征向量、特征值std::cout << "Here is the matrix A:\n" << a << std::endl;SelfAdjointEigenSolver<Matrix2d> eigensolver(a);if (eigensolver.info() != Success) abort();std::cout << "特征值:\n" << eigensolver.eigenvalues() << std::endl;std::cout << "Here's a matrix whose columns are eigenvectors of A \n"<< "corresponding to these eigenvalues:\n"<< eigensolver.eigenvectors() << std::endl;
}

解线性方程

#include <iostream>
#include <Eigen/Dense>
using namespace std;
using namespace Eigen;
int main()
{//线性方程求解 Ax =B;Matrix4d A;A << 2,-1,-1,1,1,1,-2,1,4,-6,2,-2,3,6,-9,7;Vector4d B(2,4,4,9);Vector4d x = A.colPivHouseholderQr().solve(B);Vector4d x2 = A.llt().solve(B);Vector4d x3 = A.ldlt().solve(B);	std::cout << "The solution is:\n" << x <<"\n\n"<<x2<<"\n\n"<<x3 <<std::endl;
}

除了colPivHouseholderQr、LLT、LDLT,还有以下的函数可以求解线性方程组,请注意精度和速度: 解小矩阵(4*4)基本没有速度差别

DecompositionMethod矩阵特殊要求速度精度
PartialPivLUpartialPivLu()可逆+++
FullPivLUfullPivLu()None-+++
HouseholderQRhouseholderQr()None+++
ColPivHouseholderQRcolPivHouseholderQr()None+++
FullPivHouseholderQRfullPivHouseholderQr()None-+++
LLTllt()正定++++
LDLTldlt()正或负半定 Positive or negative semidefinite+++++

最小二乘求解

最小二乘求解有两种方式,jacobiSvd或者colPivHouseholderQr,4*4以下的小矩阵速度没有区别,jacobiSvd可能更快,大矩阵最好用colPivHouseholderQr

#include <iostream>
#include <Eigen/Dense>
using namespace std;
using namespace Eigen;
int main()
{MatrixXf A1 = MatrixXf::Random(3, 2);std::cout << "Here is the matrix A:\n" << A1 << std::endl;VectorXf b1 = VectorXf::Random(3);std::cout << "Here is the right hand side b:\n" << b1 << std::endl;//jacobiSvd 方式:Slow (but fast for small matrices)std::cout << "The least-squares solution is:\n"<< A1.jacobiSvd(ComputeThinU | ComputeThinV).solve(b1) << std::endl;//colPivHouseholderQr方法:faststd::cout << "The least-squares solution is:\n"<< A1.colPivHouseholderQr().solve(b1) << std::endl;
}

稀疏矩阵

稀疏矩阵的头文件包括:

  #include <Eigen/SparseCore>#include <Eigen/SparseCholesky>#include <Eigen/IterativeLinearSolvers>#include <Eigen/Sparse>

初始化有两种方式: 1.使用三元组插入

typedef Eigen::Triplet<double> T;
std::vector<T> tripletList;
triplets.reserve(estimation_of_entries); //estimation_of_entries是预估的条目
for(...)
{tripletList.push_back(T(i,j,v_ij));//第 i,j个有值的位置的值
}
SparseMatrixType mat(rows,cols);
mat.setFromTriplets(tripletList.begin(), tripletList.end());
// mat is ready to go!

2.直接将已知的非0值插入

SparseMatrix<double> mat(rows,cols);
mat.reserve(VectorXi::Constant(cols,6));
for(...)
{// i,j 个非零值 v_ij != 0mat.insert(i,j) = v_ij;
}
mat.makeCompressed(); // optional

稀疏矩阵支持大部分一元和二元运算:

sm1.real() sm1.imag() -sm1 0.5*sm1
sm1+sm2 sm1-sm2 sm1.cwiseProduct(sm2)

二元运算中,稀疏矩阵和普通矩阵可以混合使用

//dm表示普通矩阵
dm2 = sm1 + dm1;

也支持计算转置矩阵和伴随矩阵

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/258796.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

汇编程序:将字符串中所有大写字符转为小写

【任务】 编写程序&#xff0c;将数据区中定义的以0作为结束符的一个字符串中所有的大写字符&#xff0c;全部转换为小写。 【参考解答】 assume cs:cseg, ds:dseg, ss:sseg sseg segment stackdw 100h dup (?) sseg ends dseg segmentdb YanTai123University, 0 d…

从零开始编写自己的C#框架(1)——前言

记得十五年前自学编程时&#xff0c;拿着C语言厚厚的书&#xff0c;想要上机都不知道要用什么编译器来执行书中的例子。十二年前在大学自学ASP时&#xff0c;由于身边没有一位同学和朋友学习这种语言&#xff0c;也只能整天混在图收馆里拼命的啃书。而再后来也差不多&#xff0…

Bash内置命令

Bash有很多内置命令&#xff0c;因为这些命令是内置的&#xff0c;因此bash不需要在磁盘上为它们定位&#xff0c;执行速度更快。 1&#xff09;列出所有内置命令列表$enable 2&#xff09;关闭内置命令test$enable -n test 3&#xff09;打开内置命令test$enable test 4&…

postman调用webservice接口_接口对前后端和测试的意义

1.什么是接口&#xff1f;接口测试主要用于外部系统与系统之间以及内部各个子系统之间的交互点&#xff0c;定义特定的交互点&#xff0c;然后通过这些交互点来&#xff0c;通过一些特殊的规则也就是协议&#xff0c;来进行数据之间的交互。2.接口都有哪些类型&#xff1f;接口…

基于代数距离的椭圆拟合

问题 给定离散点集Xi(xi,yi),i1,2,...NX_i(x_i,y_i) ,i1,2,...NXi​(xi​,yi​),i1,2,...N&#xff0c;我们希望找到误差最小的椭圆去拟合这些离散点。 方法 由于椭圆的形式可以给定&#xff0c; 自然我们将使用最小二乘法来求解椭圆。主要依据论文《Direct least squares f…

Java与C语言比较(Java参考书中摘录)

C语言为面向过程的编程语言&#xff0c;Java为面向对象的编程语言。 在面向过程的编程语言(如C语言)中&#xff0c;编程一般面向操作&#xff0c;编程单位是函数(在Java中函数称为方法)。 在Java中&#xff0c;编程单位是类。最终实例化(即创建)这些类而得到对象&#xff0c;属…

Android调试技巧之Eclipse行号和Logcat

很多初入Android的开发者可能会发现经常遇到Force Close或ANR这样的问题&#xff0c;一般我们通过Android系统的错误日志打印工具Logcat可以看到出错的内容&#xff0c;今天一起来说下如何通过 Eclipse行号和Logcat捕捉出错点&#xff0c;我们遇到错误可以首先在Eclipse的DDMS中…

第六章 产权市场

《市场经济概论》&#xff08;6&#xff09;产权市场一 第六章 产权市场 产权是指人们对于某种资产所拥有的所有权、占有权、支配权、使用权。产权市场是指人们对于某种资产所拥有的所有权、占有权、支配权、使用权进行有偿转让的场所领域及其有关各方面相互关系的总和。在过去…

js打开本地文件夹_vue + ArcGIS 地图应用系列一:arcgis api本地部署(开发环境)

1. 下载 ArcGIS API for JavaScript 官网地址&#xff1a; https://developers.arcgis.com/javascript/3/ 下载地址&#xff1a;http://links.esri.com/javascript-api/latest-download需要稳定的网络环境注册账号后才可以下载下载完成后解压文件&#xff0c;文件比较大可能需要…

基于几何距离的椭圆拟合

问题 给定离散点集Xi(xi,yi)X_i(x_i,y_i)Xi​(xi​,yi​)&#xff0c;我们希望找到最好的椭圆去拟合这些离散点。 方法 通常我们使用最小二乘法求解如下的最优化问题&#xff1a; Min∑i1Nf(xi,E)2Min \sum_{i1}^N f(x_i,E)^2 Mini1∑N​f(xi​,E)2 这里f(xi,E)f(x_i,E)f(xi…

Generate Parentheses

题目 Given n pairs of parentheses, write a function to generate all combinations of well-formed parentheses. For example, given n 3, a solution set is: "((()))", "(()())", "(())()", "()(())", "()()()" 方法…

ReportViewer 2010 打印预览,用鼠标快速切换显示比例时报错:存储空间不足,不能处理此命令...

CreateCompatibleDIB 存储空间不足 无法处理此命令 安装 ReportViewer 2010 sp1 即可。转载于:https://www.cnblogs.com/runliuv/p/3640856.html

贪心/二分查找 BestCoder Round #43 1002 pog loves szh II

题目传送门 1 /*2 贪心/二分查找&#xff1a;首先对ai%p&#xff0c;然后sort&#xff0c;这样的话就有序能使用二分查找。贪心的思想是每次找到一个aj使得和为p-1(如果有的话)3 当然有可能两个数和超过p&#xff0c;那么an的值最优&#xff0c;每次还要和…

nohup命令输出日志_逼格高又实用的Linux高级命令,开发运维都要懂

在运维的坑里摸爬滚打好几年了&#xff0c;我还记得我刚开始的时候&#xff0c;我只会使用一些简单的命令&#xff0c;写脚本的时候&#xff0c;也是要多简单有多简单&#xff0c;所以有时候写出来的脚本又长又臭&#xff0c;像一些高级点的命令&#xff0c;比如说Xargs 命令、…

JavaScript中OOP——面向对象中的继承/闭包

前 言 OOP JavaScript中OOP——>>>面向对象中的继承/闭包 1.1面向对象的概念 使用一个子类继承另一个父类&#xff0c;子类可以自动拥有父类的属性和方法。>>> 继承的两方&#xff0c;发生在两个类之间。1.2JS模拟实现继承的三种方式&#xff1a; 首先&am…

js常用字符串函数

这些东西是以前整理的&#xff0c;放到这里&#xff0c;有需要的可以看看~挺全的~ /** * anchor()方法 * 在对象中的指定文本两端放置一个有Name属性的HTML锚点 * strVariable.anchor(anchorString) anchorString为锚点名称 * 它本身不会检查其他的ahchor锚点是否有name指…

c++11中的智能指针

在C11中有四种智能指针&#xff0c;auto_ptr&#xff0c;shared-ptr&#xff0c;unique_ptr和weak-ptr&#xff0c;其中auto_ptr有许多不足之处&#xff0c;在C11中已经建议废弃使用。 1. shared_ptr std::shared_ptr智能指针可以通过共享指向对象的所有权&#xff0c;从而实现…

ubuntu14.04设置静态IP

啊&#xff0c;最近懒惰了&#xff0c;好久没有写博客了。 一般机器启动的时候会自动从DHCP服务器上面获取动态IP地址&#xff0c;这是一件很方便的事情&#xff0c;可以不用手动设置网络相关的蚕参数&#xff0c;但是有时候还是需要机器固定IP地址的。 第一步&#xff0c;编辑…

高中学历python培训靠谱吗_高中学历学完Python就能干人工智能?

最近Python大热&#xff0c;主要是人工智能的热度&#xff0c;昨天后院活动部介绍了一位女网友为男朋友选择Java还是Python&#xff0c;大量的程序员热议&#xff0c;也有人询问如何学习Python&#xff0c;比如这位网友询问高中学历学习Python是不是就能干人工智能。兄弟&#…

curl+个人证书(又叫客户端证书)访问https站点

目前&#xff0c;大公司的OA管理系统&#xff08;俗称内网&#xff09;&#xff0c;安全性要求较高&#xff0c;通常采用https的双向 认证模式。 首先&#xff0c;什么是https&#xff0c;简单的说就是在SSL协议之上实现的http协议&#xff08;get、post等操作&#xff09;。更…