Eigen基本操作

// 矩阵 Eigen::Matrix<float,行,列> // Eigen 中所有向量和矩阵都是Eigen::Matrix,它是一个模板类。它的前三个参数为:数据类型,行,列// 声明一个2*3的float矩阵Eigen::Matrix<float, 2, 3> matrix_23;//float类型//向量 Eigen::Vector3d // 同时,Eigen 通过 typedef 提供了许多内置类型,不过底层仍是Eigen::Matrix// 例如 Vector3d 实质上是 Eigen::Matrix<double, 3, 1>,即三维向量Eigen::Vector3d v_3d;//double类型// 这是一样的Eigen::Matrix<float,3,1> vd_3d;//float类型// Matrix3d 实质上是 Eigen::Matrix<double, 3, 3>Eigen::Matrix3d matrix_33 = Eigen::Matrix3d::Zero(); //零矩阵// MatrixXd::Identity() 单位矩阵  Eigen::Matrix3d::Random(); 随机数矩阵  MatrixXd::Ones(rows,cols)     // 均可以 用C.setXXX 设置  C.setIdentity(rows,cols)   设置单位矩阵// 向量初始化  VectorXd::LinSpaced(size,low,high)  // 线性分布// 如果不确定矩阵大小,可以使用动态大小的矩阵  建议大矩阵使用 Eigen::Matrix< double, Eigen::Dynamic, Eigen::Dynamic > matrix_dynamic;// 更简单的Eigen::MatrixXd matrix_x;// 这种类型还有很多,我们不一一列举// 下面是对Eigen阵的操作// 输入数据(初始化)//  在Eigen中重载了”<<”操作符// 通过该操作符即可以一个一个元素的进行赋值,// 也可以一块一块的赋值。// 另外也可以使用下标进行赋值。//matrix_23 << 1, 2, 3, 4, 5, 6;matrix_23 << 2,3,4,5,6;  //注意常量矩阵的赋值// 正常矩阵形式输出cout << matrix_23 << endl;// 用()访问矩阵中的元素// 针对向量还提供”[]”操作符,注意矩阵则不可如此使用for (int i=0; i<2; i++) {for (int j=0; j<3; j++)cout<<matrix_23(i,j)<<"\t";//每行元素的分隔符cout<<endl;//换行}// 矩阵和向量相乘(实际上仍是矩阵和矩阵)v_3d << 3, 2, 1;//double 类型vd_3d << 4,5,6;//float 类型// 但是在Eigen里你不能混合两种不同类型的矩阵,像这样是错的// Eigen::Matrix<double, 2, 1> result_wrong_type = matrix_23 * v_3d;// 应该显式转换 matrix_23.cast<double>   float类型转换成 double类型Eigen::Matrix<double, 2, 1> result = matrix_23.cast<double>() * v_3d;cout << result << endl;// float类型 * float 类型Eigen::Matrix<float, 2, 1> result2 = matrix_23 * vd_3d;cout << result2 << endl;// 同样你不能搞错矩阵的维度// 试着取消下面的注释,看看Eigen会报什么错// Eigen::Matrix<double, 2, 3> result_wrong_dimension = matrix_23.cast<double>() * v_3d;// 一些矩阵运算// 四则运算就不演示了,直接用+-*/即可。matrix_33 = Eigen::Matrix3d::Random();      // 随机数矩阵cout << "Random :Matrix3d matrix_33 =\n" << matrix_33 << endl << endl;cout << "matrix_33.transpose =\n" << matrix_33.transpose() << endl;      // 转置cout << "matrix_33.sum=\n" <<  matrix_33.sum() << endl;            // 各元素和cout << "matrix_33.trace=\n" << matrix_33.trace() << endl;          // 迹cout << 10*matrix_33 << endl;               // 数乘cout << matrix_33.inverse() << endl;        // 逆cout << matrix_33.determinant() << endl;    // 行列式// 特征值// 实对称矩阵可以保证对角化成功Eigen::SelfAdjointEigenSolver<Eigen::Matrix3d> eigen_solver ( matrix_33.transpose()*matrix_33 );cout << "Eigen values = \n" << eigen_solver.eigenvalues() << endl;//特征值cout << "Eigen vectors = \n" << eigen_solver.eigenvectors() << endl;//特征向量// 解方程// 我们求解 matrix_NN * x = v_Nd 这个方程// N的大小在前边的宏里定义,它由随机数生成// 直接求逆自然是最直接的,但是求逆运算量大Eigen::Matrix< double, MATRIX_SIZE, MATRIX_SIZE > matrix_NN;matrix_NN = Eigen::MatrixXd::Random( MATRIX_SIZE, MATRIX_SIZE );//随机变量初始化Eigen::Matrix< double, MATRIX_SIZE,  1> v_Nd;        //列向量v_Nd = Eigen::MatrixXd::Random( MATRIX_SIZE,1 ); //随机变量初始化clock_t time_stt = clock(); // 计时// 直接求逆Eigen::Matrix<double,MATRIX_SIZE,1> x = matrix_NN.inverse()*v_Nd;//cout << "x = \n" << x << endl;cout <<"time use in normal inverse is " << 1000* (clock() - time_stt)/(double)CLOCKS_PER_SEC << "ms"<< endl;// 通常用矩阵分解来求,例如QR分解,速度会快很多time_stt = clock();x = matrix_NN.colPivHouseholderQr().solve(v_Nd);//cout << "x = \n" << x << endl;cout <<"time use in Qr decomposition is " <<1000*  (clock() - time_stt)/(double)CLOCKS_PER_SEC <<"ms" << endl;//矩阵分块Eigen::Matrix<double,5,5> Matrix_55;Matrix_55 = Eigen::MatrixXd::Random(5,5);cout<<"Random Matrix_55 :\n"<<Matrix_55<<endl;Eigen::Matrix3d matrixI33 = Eigen::Matrix3d::Identity();cout<<"Eye matrixI33 :\n"<<matrixI33<<endl;Matrix_55.topLeftCorner(3,3)=matrixI33;cout<<"Random Matrix_55 topLeft block replace by Eye matrixI33 :\n"<<Matrix_55<<endl;

 

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

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

相关文章

所感

记住别太善良了&#xff0c;别太大方了&#xff0c;也别太能干了&#xff0c;时间久了人家会觉得&#xff0c;你做的一切都是应该的。即使有一天你撑不住&#xff0c;哭了累了&#xff0c;也没人心疼你。 因为在他们眼里这都是你愿意的。有时候心眼也别太好了不要什么事都为别人…

PCL库使用中遇到的一些问题及解决方法

a. pcl::PointCloud对象变量 与pcl::PointCloud::Ptr 对象指针 的相互转换 #include <pcl/io/pcd_io.h> #include <pcl/point_types.h> #include <pcl/point_cloud.h> // 对象指针 pcl::PointCloud<pcl::PointXYZ>::Ptr cloudPointer(new pcl:…

享受孤独

今天看见网易云音乐一个 有趣的活动。。。突发其感参与了评论“孤独”这个话题&#xff1a;

opencv 图像访问索引

//单通道获取 Scalar intensity img.at<uchar>(y, x);//行 列 Scalar intensity img.at<uchar>(Point(x, y)); 0 < intensity.val[0] < 255. // 多通道获取 8u Vec3b intensity img.at<Vec3b>(y, x); uchar blue intensity.val[0]…

使自己的注意力集中方法

英国Kent大学最近有一篇文章对注意力做出了详尽的分析&#xff0c;关于如何保持专心养成好习惯的&#xff0c;其中包括了如下几点建议&#xff1a; 养成好习惯&#xff1a;养成在固定时间、固定地点专心学习工作的好习惯。如果可能&#xff0c;在进入学习或者工作状态前做一些小…

PCL “(”:“::”右边的非法标记 和 E2512 功能测试宏的参数必须是简单标识符

PCL “(”:“::”右边的非法标记 解决方法&#xff1a; 项目属性 ——> C/C ——> 预处理器 ——> 预处理器定义 (此处添加预定义编译开关 NOMINMAX&#xff09; E2512 功能测试宏的参数必须是简单标识符 解决方法&#xff1a; 将SDL 设置为否。

最全ACM常用STL

STL 中专门用于排列的函数&#xff08;可以处理存在重复数据集的排列问题&#xff09; 头文件&#xff1a;#include <algorithm> using namespace std; 调用&#xff1a; next_permutation(start, end); 注意&#xff1a;函数要求输入的是一个升序排列的序列的头指针和尾…

ubuntu 安装cmake

方法一&#xff1a; sudo apt-get install cmake 跟新中。。。。。。。。。

普通本科生应该坚持ACM吗?知乎

这是本人当初学ACM有疑惑从知乎看见这一篇文章&#xff0c;从中解决了自己的疑惑&#xff0c;虽然是粘贴复制&#xff0c;但是我觉得我们可以从里面找出自己想要的答案&#xff01; 非211一本学校&#xff0c;软件工程专业。学校搞ACM的水平不高&#xff0c;最好的大概就是区域…

邻接表存储图利用BFS遍历

//今天上机写的邻接表存储图利用BFS遍历&#xff1a; #include<stdio.h> #include<stdlib.h> #include<string.h> #include<iostream> using namespace std; struct node//存节点所连接的点 {int id;node *next; }; struct list//存各个节点的顶点值 {…

windows 安装tensorflow2.0

预先装好python 然后在命令行输入&#xff1a; gpu版本&#xff1a; 需要预先装好&#xff1a;cuda 和cudnn 才能使用。 pip install numpy pandas matplotlib sklearn tensorflow-GPU2.0.0-alpha0 -i https://pypi.doubanio.com/simple cpu 版本&#xff1a; alpha0 &…

解决虚拟机打开不了?提示VMware Workstation cannot connect to the virtual machine的问题

解决方法&#xff1a; 从提示消息我们可以看到&#xff0c;问题在于VMware授权服务没有开启&#xff0c;具体处理方法如下&#xff1a; No1. "This PC&#xff08;我的电脑&#xff09;"---右键"manage&#xff08;管理&#xff09;"---"Service and…

双目立体匹配算法

Loopy belief propagation, Markov Random Field, stereo vision website&#xff1a;http://nghiaho.com/?page_id1366

Redis-3.2.4服务搭建

1.下载安装包并解压 全部版本地址&#xff1a;http://download.redis.io/releases 安装包下载&#xff1a; http://download.redis.io/releases/redis-3.2.4.tar.gz 我们这里使用3.2.4 2.编译安装 cd redis-3.2.4 make && make install 可能异常&#xff1a;&…

Android Fragment 真正的完全解析(上)

转载请标明出处&#xff1a;http://blog.csdn.net/lmj623565791/article/details/37970961 自从Fragment出现&#xff0c;曾经有段时间&#xff0c;感觉大家谈什么都能跟Fragment谈上关系&#xff0c;做什么都要问下Fragment能实现不~~~哈哈&#xff0c;是不是有点过~~~ 本篇博…

Hbase Import导入数据异常处理-RetriesExhaustedWithDetailsException

CDH显示 问题导致原因&#xff1a; hbase org.apache.hadoop.hbase.mapreduce.Import -Dmapred.job.queue.nameetl crawl:wechat_biz /hbase/test4 执行import时&#xff0c;短时间内写入数据量过大导致写入异常。 18/09/11 09:44:27 INFO mapreduce.Job: Task Id : attempt_…

Android RecyclerView 使用完全解析 体验艺术般的控件

转载请标明出处&#xff1a; http://blog.csdn.net/lmj623565791/article/details/45059587&#xff1b; 本文出自:【张鸿洋的博客】 概述 RecyclerView出现已经有一段时间了&#xff0c;相信大家肯定不陌生了&#xff0c;大家可以通过导入support-v7对其进行使用。 据官方的…

三维刚体变换

1.旋转向量&#xff1a; 满足以下关系 (E单位阵) 进一步得到&#xff1a; p经过旋转和平移得到,公式表达如下&#xff1a; ;(t平移矩阵) 我们可以将上面的式子写成齐次&#xff1a; T也成为变换举证&#xff08;transform Matrix&#xff09; 它的反变换可以表示如下&am…

Hbase1.2数据导入2.0

场景&#xff1a;现有一批之前导出的数据&#xff0c;发现2.0版本hbck工具更新&#xff0c;无法直接导入&#xff0c;跨机房使用export/import方式需要重新外网传输数据比较耗时&#xff0c;现搭建临时hbase版本1.2&#xff0c;在同机房进行export/import方式 数据导入hbase1.…