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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • linux内核 lock free

    linux内核 lock free//同步问题:对共享数据的访问,需要同步,互斥。在中断,抢占,多CPU,多线程环境下尤其重要。 同步分为: 阻塞同步,非阻塞同步阻塞同步有许多实现方式了:mutex,semaphore.阻塞同步使用不当就可能造成死锁,活锁,优先级反转。非阻塞同步:(现在流行三种) waitfree 很难实现,思想是本线程有限步就完成,完全不用理其余线程。 lock

    2022年7月19日
    13
  • 关于checkbox选中问题总结「建议收藏」

    关于checkbox选中问题总结「建议收藏」(1)ng-checked的值只是用来决定初始状态时选中还是为选中,ng-model才是随着复选框是否被选中,来实时改变它绑定变量的值。(2)如果初始状态ng-checked和ng-model指令

    2022年7月1日
    21
  • 远程读取elasticSearch数据库并导出数据「建议收藏」

    远程读取elasticSearch数据库并导出数据「建议收藏」packageorg.elasticsearch.esTest;importjava.awt.List;importjava.io.BufferedWriter;importjava.io.File;importjava.io.FileWriter;importjava.io.IOException;importjava.util.ArrayList;importjava

    2022年6月6日
    73
  • Protecting World Leaders Against Deep Fakes(CVPR 2020)

    Protecting World Leaders Against Deep Fakes(CVPR 2020)文章目录IntroductionInnovationMethodExperimentProtectingWorldLeadersAgainstDeepFakes(CVPR2020)paperPDFIntroduction深度学习的应用促使了人脸伪造技术的巨大进步。现有AI-合成的人脸伪造方式可以分为以下三种:faceswap:将视频中出现的人脸替换为其他人的脸,一般对整个面部进行对齐和替换lip-sync:使得视频中的人物口型按照既定音频变化,一般仅伪造目标的唇部区域pupp

    2022年5月26日
    33
  • 非主流免费播放器|免费QQ空间播放器代码|非主流播放器

    非主流免费播放器|免费QQ空间播放器代码|非主流播放器 script type=”text/javascript”>…google_ad_client = “pub-2372065995666058”;/**//* btttttttttttt */google_ad_slot = “7097305745”;google_ad_width = 468;google_ad_height = 15;//–>script>script type

    2022年10月9日
    1
  • sqlyog证书密钥(注册码)_SQLyog安装教程

    sqlyog证书密钥(注册码)_SQLyog安装教程SQLyogv12.09(64bit)注册码姓名(Name):cr173序列号(Code):8d8120df-a5c3-4989-8f47-5afc79c56e7c或者(OR)姓名(Name):ttrar序列号(Code):8d8120df-a5c3-4989-8f47-5afc79c56e7c…

    2022年4月20日
    4.6K

发表回复

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

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