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)
上一篇 2022年10月10日 下午3:00
下一篇 2022年10月10日 下午3:16


相关推荐

  • pytest skipif_白盒测试用例

    pytest skipif_白盒测试用例前言pytest.mark.skip可以标记无法在某些平台上运行的测试功能,或者您希望失败的测试功能Skip和xfail:处理那些不会成功的测试用例你可以对那些在某些特定平台上不能运行的测试用

    2022年7月28日
    4
  • python字符串删除指定符号(不限位置)「建议收藏」

    python字符串删除指定符号(不限位置)「建议收藏」python中去掉字符串中某些不想要的字符:1、一般的可以用replace()这个函数不限定位置,是可以替换原来不想要的字符,替换成空字符就相当于删除了2、也可以用strip(),删除两边的字符(默认是删除左右空格)rstrip(),lstrip()这两个可以选择只删除左边或者右边3、re.sub这个可以根据正则删除,此处是删除串中的数字1-9,字符a-z,A-Z,还可以加其他的importrestr=”aksj2343ngr4545g黄金叶子fg”temp=re.sub(‘[a

    2022年6月4日
    76
  • 数据库添加字段sql语句

    数据库添加字段sql语句在咱们平时开发的时候 很容易遇到这种状况 就是在开发的时候 有的需求可能会拓展咱们数据库中的表 好比添加字段什么的 下面就是添加字段的 sql 语句 sql 添加一个字段 数据库 altertable 表名 add 字段名 varchar 32 comment 备注名 开发这样就会在你的表中添加一个字段了 table 若是是一次添加多个字段的话 sql 语句 altertable 表名 add 字段名 varchar 32 comment 备注名 add 字段名 varchar 32 comment 备

    2026年3月18日
    2
  • aiohttp的使用

    aiohttp的使用aiohttp 介绍 aiohttp 强调的是异步并发 提供了对 asyncio await 的支持 可以实现单线程并发 IO 操作 安装 pipinstallai 使用方法 1 普通发请求 importaiohtt asyncwithaio C

    2026年3月18日
    2
  • 搭建邮件服务器,过程非常简单「建议收藏」

    搭建邮件服务器,过程非常简单,只需几个步骤即可。通常在Linux搭建邮件服务器是需要安装很多软件和配置文件的,所以我们可以使用一个开源邮件服务器软件来搭建的。

    2022年4月10日
    119
  • rose服务器系统,ROSE HA 服务器集群软件

    rose服务器系统,ROSE HA 服务器集群软件1 ROSEHA 服务器集群软件在双机热备的架构中 除了要考虑切换时间外 要根据每个系统的作业环境 包括网路系统是单网或是双网 数据库的安装和作业内容及用户端的设备是经由广域网路 区域网路接入不同用户有不同的需求 而要求有不同的切换模式 所以选择不同的切换模式 可以使用户端的改变达到最少的程度 ROSEHA 根据不同的行业及各行业不同的需求设计多种备援模式以弹性的调适用户的最佳组合及选择 ROS

    2026年3月19日
    1

发表回复

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

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