Eigen库在VS2017下的配置与使用

Eigen库在VS2017下的配置与使用参考:Eigen的简介和下载安装https://www.cnblogs.com/goingupeveryday/p/5699053.htmlC++矩阵处理工具——Eigenhttps://blog.csdn.net/abcjennifer/article/details/7781936C++开源矩阵计算工具——Eigen在VS2005中的下载、配置与使用…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

参考:
Eigen 的简介和下载安装 https://www.cnblogs.com/goingupeveryday/p/5699053.html
C++矩阵处理工具——Eigen https://blog.csdn.net/abcjennifer/article/details/7781936
C++开源矩阵计算工具——Eigen 在VS2005中的下载、配置与使用 https://blog.csdn.net/houjixin/article/details/8477522

Eigen库——c++开源矩阵运算库
(本人对较多介绍Eigen库的文章的总结)

一、Eigen库的配置(VS2017)

  1. Eigen库下载: http://eigen.tuxfamily.org/index.php?title=Main_Page
    下载文件并解压:
    在这里插入图片描述
  2. 新建文件名为eigen3的文件夹,并将Eigen文件夹拷贝到其中。
    将eigen3文件夹移至常用路径下。本人的是:F:\Program Files\eigen3。
    在这里插入图片描述
  3. 打开VS(本人用的是2017版),新建项目:新建->项目->Visual C++ -> Windows桌面->Windows控制台应用程序。
    在解决方案资源管理器中,右键项目名称,选择属性。如下图。
    在这里插入图片描述
    如下图添加eigen3文件夹的路径,点击应用、确定即可。
    在这里插入图片描述
  4. 简单的代码验证
#include <iostream>
#include <Eigen/Dense>
using namespace Eigen;     // 改成这样亦可 using Eigen::MatrixXd; 
using namespace std;
int main()
{
	MatrixXd m = MatrixXd::Random(3,3);              //随机生成3*3的double型矩阵
	m = (m + MatrixXd::Constant(3,3,1.2)) * 50;      //MatrixXd::Constant(3,3,1.2)表示生成3*3的double型矩阵,该矩阵所有元素均为1.2
	cout << "m =" << endl << m << endl;
	VectorXd v(3);        // 定义v为3*1的double型向量
	v << 1, 2, 3;         // 向量赋值
	cout << "m * v =" << endl << m * v << endl;
	system("pause");
	return 0;
}

二、Eigen库的使用

在文件头中加入
#include <Eigen/Dense>

  1. 矩阵&向量的定义与赋值
    MatrixXd:定义任意维double矩阵。其中X表示维度,d表示double型。同理d可改为f或者i,分别表示float型、int型。
    Matrix2d:定义2维double矩阵(2×2)
    Matrix3d:定义3维double矩阵(3×3)

    VectorXd 定义任意维double向量
    Vector2d 定义2维double向量(2×1)
    Vector3d 定义3维double向量(3×1)

    具体使用:

//1、定义
MatrixXd temp1(3, 4); //定义3*4的矩阵
MatrixXd temp2(3, 3); //定义3*3的矩阵
VectorXd temp3(3, 1); //定义3维行向量
Vector3d temp4;       //定义3维行向量
//2、赋值
temp1 <<1,2,3,4,
	5,6,7,8,
	9,0,0,0;
temp4 <<1,
	1,
	1;

注意:矩阵的拼接与赋值方式相同!

矩阵的索引:
在这里插入图片描述

cout<< temp1 (0,0) <<endl;
cout<< temp1 (0,1) <<endl;
cout<< temp1 (1,0) <<endl;
cout<< temp1 (1,1) <<endl;
//输出结果为:
1
2
5
6

特殊矩阵/向量的赋值:

Matrix3d temp1 = MatrixXd::Identity(3, 3);   //定义3*3的单位阵
Matrix3d temp2 = MatrixXd::Zero(3, 3);       //定义3*3的零矩阵
Matrix3d temp3 = MatrixXd::Ones(3, 3);       //定义3*3的全1矩阵
Vector3d temp4 = VectorXd::Zero(3, 1);       //定义3*1的零向量
Vector3d temp5 = VectorXd::Ones(3, 1);       //定义3*1的全1向量
  1. 矩阵基本运算
    常用的 “+”,“-”,“*”, “/” 与一般的C语言操作相同。
    2.1 行列数
MatrixXd R(3, 3);
double row = R.rows();      //row为R矩阵的行数
double col = R.cols();      //col为R矩阵的列数

2.2 转置、逆、行列式

R.transpose();               //转置
R.inverse();                 //逆
double d = R.determinant();  //行列式

2.3、叉乘

// 此处的代码未给出矩阵/向量的赋值!
Vector3d temp1(3, 1), temp2(3, 1);
temp1.cross(temp2);         //temp1×temp2

2.4、svd分解

Matrix3d  H;
JacobiSVD<Eigen::MatrixXd> svd(H, ComputeThinU | ComputeThinV);
Matrix3d V = svd.matrixV(), U = svd.matrixU();
Matrix3d D = U.inverse() * H * V.transpose().inverse(); // S = U^-1 * A * VT^ -1

2.5、秩

Matrix3d D;
FullPivLU<Matrix3d> lu(D);
int r = lu.rank();  
cout << "By default, the rank of A is found to be " << lu.rank() << endl;
lu.setThreshold(1e-5);
cout << "With threshold 1e-5, the rank of A is found to be " << lu.rank() << endl;

2.6、矩阵子块的提取

MatrixXd temp(3, 2);
temp << 0, 1,
	2, 3,
	4, 5;
cout << temp.block(0,0,3,1)<<endl; //从矩阵temp(0,0)为起始点,取三行一列
cout << temp.block(0,1,3,1)<<endl; //从矩阵temp(0,1)为起始点,取三行一列

//输出结果为:
0
2
4
1
3
5

矩阵按行遍历:

MatrixXd R(3, 3);
R << 1,2,3,
     4,5,6,
     7,8,9;
double row = R.rows();      //row为R矩阵的行数
double col = R.cols();      //col为R矩阵的列数
for(int i=0;i<row;i++)
{
	cout<<R.block(i,0,1,col)<<endl;
}

矩阵按列遍历:

for(int i=0;i<col;i++)
{
	cout<<R.block(0,i,row,1)<<endl;
}

更多操作参见:http://igl.ethz.ch/projects/libigl/matlab-to-eigen.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/183524.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • pycharm结果显示窗口_pycharm怎么显示图片

    pycharm结果显示窗口_pycharm怎么显示图片问题描述在电脑中重新安装Anaconda3&PyCharm后,运行原来的程序画图时出现了下图界面。不能弹出如下图所示的“figure”窗口。解决方法:这是因为PyCharm在Sciview中开放它。具体操作步骤如下所示:1、“File—&gt;Settings”,打开Settings窗口。2、找到“PythonScientific”,去除右边候选框中的勾号。…

    2022年8月25日
    6
  • 编译时异常和运行时异常[通俗易懂]

    编译时异常和运行时异常[通俗易懂] 一,异常的概念Throwable: 有两个重要的子类:Exception(异常)和 Error(错误),二者都是 Java 异常处理的重要子类,各自都包含大量子类。Error(错误):是程序无法处理的错误,表示运行应用程序中较严重问题。大多数错误与代码编写者执行的操作无关,而表示代码运行时 JVM(Java 虚拟机)出现的问题。例如,Java虚拟机运行错误(Virtual Mac…

    2022年6月13日
    25
  • SpringMVC 工作原理

    SpringMVC 工作原理1.客户端请求提交到DispatcherServlet2.由DispatcherServlet控制器查询一个或多个HandlerMapping,找到处理请求的Controller3.DispatcherServlet将请求提交到Controller4.Controller调用业务逻辑处理后,返回ModelAndView5.DispatcherServlet查询一个或多个ViewResoler视图解析器,找到ModelAndView指定的视图,并将结果显示到客户

    2022年5月14日
    40
  • Linux-dosbox使用「建议收藏」

    2019独角兽企业重金招聘Python工程师标准>>>…

    2022年4月9日
    139
  • Java中BufferedWriter类的常用方法

    Java中BufferedWriter类的常用方法BufferedWriter:字符缓冲输出流构造方法BufferedWriter(Writerout):默认缓冲区大小构造字符缓冲输出流对象BufferedWriter(Writerout,intsize):指定缓冲区大小常用方法publicvoidwrite(intc)throwsIOException写入单个字符。c-指定要写入字符的int。publicvoidwr…

    2022年5月30日
    37
  • python爬虫的4个实例

    python爬虫的4个实例文章目录1、京东商品页面的爬取2、亚马逊商品页面的爬取3、百度、360搜索关键字提交1、京东商品页面的爬取爬虫具体流程可以参照前一篇博客:https://blog.csdn.net/weixin_42515907/article/details/87932185importrequestsurl=&quot;https://item.jd.com/3112072.html&quot;try:…

    2022年5月7日
    42

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号