Eigen(4)矩阵基本运算

矩阵和向量的运算

    提供一些概述和细节:关于矩阵、向量以及标量的运算。

1. 介绍

    Eigen提供了matrix/vector的运算操作,既包括重载了c++的算术运算符+/-/*,也引入了一些特殊的运算比如点乘dot、叉乘cross等。

    对于Matrix类(matrixvectors)这些操作只支持线性代数运算,比如:matrix1*matrix2表示矩阵的乘机,vetor+scalar是不允许的。如果你想执行非线性代数操作,请看下一篇(暂时放下)。

2. 加减

    左右两侧变量具有相同的尺寸(行和列),并且元素类型相同(Eigen不自动转化类型)操作包括:

  • 二元运算 + a+b
  • 二元运算 - a-b
  • 一元运算 - -a
  • 复合运算 += a+=b
  • 复合运算 -= a-=b
#include <iostream>#include <Eigen/Dense>using namespace Eigen;int main(){Matrix2d a;a << 1, 2,3, 4;MatrixXd b(2,2);b << 2, 3,1, 4;std::cout << "a + b =\n" << a + b << std::endl;std::cout << "a - b =\n" << a - b << std::endl;std::cout << "Doing a += b;" << std::endl;a += b;std::cout << "Now a =\n" << a << std::endl;Vector3d v(1,2,3);Vector3d w(1,0,0);std::cout << "-v + w - v =\n" << -v + w - v << std::endl;}

输出:

a + b =

3 5

4 8

a - b =

-1 -1

 2  0

Doing a += b;

Now a =

3 5

4 8

-v + w - v =

-1

-4

-6

3. 标量乘法和除法

    乘/除标量是非常简单的,如下:

  • 二元运算 * matrix*scalar
  • 二元运算 * scalar*matrix
  • 二元运算 / matrix/scalar
  • 复合运算 *= matrix*=scalar
  • 复合运算 /= matrix/=scalar
#include <iostream>#include <Eigen/Dense>using namespace Eigen;int main(){Matrix2d a;a << 1, 2,3, 4;Vector3d v(1,2,3);std::cout << "a * 2.5 =\n" << a * 2.5 << std::endl;std::cout << "0.1 * v =\n" << 0.1 * v << std::endl;std::cout << "Doing v *= 2;" << std::endl;v *= 2;std::cout << "Now v =\n" << v << std::endl;}

结果

a * 2.5 =

2.5   5

7.5  10

0.1 * v =

0.1

0.2

0.3

Doing v *= 2;

Now v =

2

4

6

4. 表达式模板

    这里简单介绍,在高级主题中会详细解释。在Eigen中,线性运算比如+不会对变量自身做任何操作,会返回一个表达式对象来描述被执行的计算。当整个表达式被评估完(一般是遇到=号),实际的操作才执行。

    这样做主要是为了优化,比如

VectorXf a(50), b(50), c(50), d(50);

...

a = 3*b + 4*c + 5*d;

    Eigen会编译这段代码最终遍历一次即可运算完成。

for(int i = 0; i < 50; ++i)

  a[i] = 3*b[i] + 4*c[i] + 5*d[i];

    因此,我们不必要担心大的线性表达式的运算效率。

5. 转置和共轭

 表示transpose转置

 表示conjugate共轭

 表示adjoint(共轭转置) 伴随矩阵

MatrixXcf a = MatrixXcf::Random(2,2);cout << "Here is the matrix a\n" << a << endl;cout << "Here is the matrix a^T\n" << a.transpose() << endl;cout << "Here is the conjugate of a\n" << a.conjugate() << endl;cout << "Here is the matrix a^*\n" << a.adjoint() << endl;

输出

Here is the matrix a

 (-0.211,0.68) (-0.605,0.823)

 (0.597,0.566)  (0.536,-0.33)

Here is the matrix a^T

 (-0.211,0.68)  (0.597,0.566)

(-0.605,0.823)  (0.536,-0.33)

Here is the conjugate of a

 (-0.211,-0.68) (-0.605,-0.823)

 (0.597,-0.566)    (0.536,0.33)

Here is the matrix a^*

 (-0.211,-0.68)  (0.597,-0.566)

(-0.605,-0.823)    (0.536,0.33)

    对于实数矩阵,conjugate不执行任何操作,adjoint等价于transpose

    transposeadjoint会简单的返回一个代理对象并不对本省做转置。如果执行 b=a.transpose() a不变,转置结果被赋值给b。如果执行 a=a.transpose() Eigen在转置结束之前结果会开始写入a,所以a的最终结果不一定等于a的转置。

Matrix2i a; a << 1, 2, 3, 4;cout << "Here is the matrix a:\n" << a << endl;a = a.transpose(); // !!! do NOT do this !!!cout << "and the result of the aliasing effect:\n" << a << endl;

 

Here is the matrix a:

1 2

3 4

and the result of the aliasing effect:

1 2

2 4

    这被称为别名问题。在debug模式,当assertions打开的情况加,这种常见陷阱可以被自动检测到。

    对 a=a.transpose() 这种操作,可以执行in-palce转置。类似还有adjointInPlace

MatrixXf a(2,3); a << 1, 2, 3, 4, 5, 6;cout << "Here is the initial matrix a:\n" << a << endl;a.transposeInPlace();cout << "and after being transposed:\n" << a << endl;

 

Here is the initial matrix a:

1 2 3

4 5 6

and after being transposed:

1 4

2 5

3 6

6. 矩阵-矩阵的乘法和矩阵-向量的乘法

    向量也是一种矩阵,实质都是矩阵-矩阵的乘法。

  • 二元运算 *a*b
  • 复合运算 *=a*=b
#include <iostream>#include <Eigen/Dense>using namespace Eigen;int main(){Matrix2d mat;mat << 1, 2,3, 4;Vector2d u(-1,1), v(2,0);std::cout << "Here is mat*mat:\n" << mat*mat << std::endl;std::cout << "Here is mat*u:\n" << mat*u << std::endl;std::cout << "Here is u^T*mat:\n" << u.transpose()*mat << std::endl;std::cout << "Here is u^T*v:\n" << u.transpose()*v << std::endl;std::cout << "Here is u*v^T:\n" << u*v.transpose() << std::endl;std::cout << "Let's multiply mat by itself" << std::endl;mat = mat*mat;std::cout << "Now mat is mat:\n" << mat << std::endl;}

输出

Here is mat*mat:

 7 10

15 22

Here is mat*u:

1

1

Here is u^T*mat:

2 2

Here is u^T*v:

-2

Here is u*v^T:

-2 -0

 2  0

Let's multiply mat by itself

Now mat is mat:

 7 10

15 22

m=m*m并不会导致别名问题,Eigen在这里做了特殊处理,引入了临时变量。实质将编译为:

tmp = m*m

m = tmp

如果你确定矩阵乘法是安全的(并没有别名问题),你可以使用noalias()函数来避免临时变量 c.noalias() += a*b 

7. 点运算和叉运算

   dot()执行点积,cross()执行叉积,点运算得到1*1的矩阵。当然,点运算也可以用u.adjoint()*v来代替。

#include <iostream>#include <Eigen/Dense>using namespace Eigen;using namespace std;int main(){Vector3d v(1,2,3);Vector3d w(0,1,2);cout << "Dot product: " << v.dot(w) << endl;double dp = v.adjoint()*w; // automatic conversion of the inner product to a scalarcout << "Dot product via a matrix product: " << dp << endl;cout << "Cross product:\n" << v.cross(w) << endl;}

输出

Dot product: 8

Dot product via a matrix product: 8

Cross product:

 1

-2

 1

注意:点积只对三维vector有效。对于复数,Eigen的点积是第一个变量共轭和第二个变量的线性积。

8. 基础的归约操作

    Eigen提供了而一些归约函数:sum()prod()maxCoeff()minCoeff(),他们对所有元素进行操作。

#include <iostream>#include <Eigen/Dense>using namespace std;int main(){Eigen::Matrix2d mat;mat << 1, 2,3, 4;cout << "Here is mat.sum():       " << mat.sum()       << endl;cout << "Here is mat.prod():      " << mat.prod()      << endl;cout << "Here is mat.mean():      " << mat.mean()      << endl;cout << "Here is mat.minCoeff():  " << mat.minCoeff()  << endl;cout << "Here is mat.maxCoeff():  " << mat.maxCoeff()  << endl;cout << "Here is mat.trace():     " << mat.trace()     << endl;}

输出

Here is mat.sum():       10

Here is mat.prod():      24

Here is mat.mean():      2.5

Here is mat.minCoeff():  1

Here is mat.maxCoeff():  4

Here is mat.trace():     5

trace表示矩阵的迹,对角元素的和等价于 a.diagonal().sum() 

minCoeffmaxCoeff函数也可以返回结果元素的位置信息。

Matrix3f m = Matrix3f::Random();std::ptrdiff_t i, j;float minOfM = m.minCoeff(&i,&j);cout << "Here is the matrix m:\n" << m << endl;cout << "Its minimum coefficient (" << minOfM<< ") is at position (" << i << "," << j << ")\n\n";RowVector4i v = RowVector4i::Random();int maxOfV = v.maxCoeff(&i);cout << "Here is the vector v: " << v << endl;cout << "Its maximum coefficient (" << maxOfV<< ") is at position " << i << endl;

输出

Here is the matrix m:

  0.68  0.597  -0.33

-0.211  0.823  0.536

 0.566 -0.605 -0.444

Its minimum coefficient (-0.605) is at position (2,1)

 

Here is the vector v:  1  0  3 -3

Its maximum coefficient (3) is at position 2

9. 操作的有效性

    Eigen会检测执行操作的有效性,在编译阶段Eigen会检测它们,错误信息是繁冗的,但错误信息会大写字母突出,比如:

Matrix3f m;Vector4f v;v = m*v;      // Compile-time error: YOU_MIXED_MATRICES_OF_DIFFERENT_SIZES

当然动态尺寸的错误要在运行时发现,如果在debug模式,assertions会触发后,程序将崩溃。
 

MatrixXf m(3,3);VectorXf v(4);v = m * v; // Run-time assertion failure here: "invalid matrix product"

 

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

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

相关文章

beta冲刺(1/7)

作业格式 课程名称&#xff1a;软件工程1916|W&#xff08;福州大学&#xff09;作业要求&#xff1a;项目beta冲刺&#xff08;团队&#xff09;团队名称&#xff1a; 那周余嘉熊掌将得队作业目标&#xff1a;beta&#xff08;1/7&#xff09;队员学号队员姓名博客地址备注221…

qq纵横四海源码_【0基础】纵横中文网python爬虫实战

原文在此~【0基础】纵横中文网python爬虫实战​mp.weixin.qq.com大家好&#xff0c;我是你们的机房老哥&#xff01;在粉丝群的日常交流中&#xff0c;爬虫是比较常见的话题。python最强大的功能之一也是爬虫。考虑到很多0基础的小白想要入门爬虫。老哥今天就通过一个比较简单的…

Eigen(3)矩阵Matrix及其简单操作

1. Matrix类 在Eigen&#xff0c;所有的矩阵和向量都是Matrix模板类的对象&#xff0c;Vector只是一种特殊的矩阵&#xff08;一行或者一列&#xff09;。 Matrix有6个模板参数&#xff0c;主要使用前三个参数&#xff0c;剩下的有默认值。 Matrix<typename Scalar, int Ro…

java jquery_jQuery数据表和Java集成

java jqueryjQuery DataTables是一个开放源代码插件&#xff0c;用于在浏览器中创建表。 它具有许多功能&#xff0c;例如排序&#xff0c;服务器端处理&#xff0c; JQUERY UI主题滚动。 该插件的下载链接&#xff1a; http://www.datatables.net/download/ 在本演示中&am…

Eigen(2) 模块与头文件

Eigen库被分为一个Core模块和其他一些模块&#xff0c;每个模块有一些相应的头文件。 为了便于引用&#xff0c;Dense模块整合了一系列模块&#xff1b;Eigen模块整合了所有模块。一般情况下&#xff0c;include<Eigen/Dense> 就够了

白鹭龙骨异步加载

private armatureDisplay: dragonBones.EgretArmatureDisplay; /** * 加载龙骨动画 * Create scene interface */ private loadGragon(): void { let t this; t.removeGragon(); //默认男战士 let sex t.occupationSex.selectedValue ? t.occupationSex.selectedValue : 1; …

zip和unzip上的Java要点

压缩是编写文件时可以在我们的代码中发出的主要动作之一。 因此&#xff0c;我发现在zip和unzip上必不可少的简单Java代码段&#xff0c;并且必须易于访问。 要点是纯Java语言&#xff0c;并以zip格式存储两个文件。 完成后&#xff0c;打开打开的拉链并评估其内容。 import …

ppt图片丢失_041 职场PPT实战:做好的PPT换个电脑就丢字体?三招解决!

大家好&#xff0c;我是肥宅。这是《职场PPT实战》系列更文的第41篇。本期我要跟大家聊一个很实在的问题&#xff0c;字体嵌入。有小伙伴在后台提问&#xff0c;他是这么说的&#xff1a;“肥宅老师&#xff0c;我做好的PPT&#xff0c;换个电脑打开字体就变了&#xff0c;有没…

matlab sort对矩阵某一维进行排序并记录之前索引

sort函数默认升序排列&#xff0c;即‘ascend’&#xff1b; [B, index] sort(A&#xff0c;dim&#xff0c; model) B为排序后矩阵 index记录排序前的索引号 A需要进行排序操作的矩阵 dim对矩阵的维度&#xff08;一维不用指定&#xff0c;二维默认对列&#xff09; mode…

2018-2019-2 20165221 【网络对抗技术】-- Exp9 Web安全基础

2018-2019-2 20165221 【网络对抗技术】-- Exp9 Web安全基础 目录&#xff1a; 一 . 实验要求二 . 实验过程记录 1 . Webgoat安装2 . SQL注入的攻击 命令注入&#xff08;Command Injection&#xff09;数字型注入&#xff08;Numeric SQL Injection&#xff09;日志欺骗&#…

python不同目录调用_python3 不同目录间模块调用

#Author by Andy#_*_ coding:utf-8 _*_#__file__获取当前程序的相对路径import os,sys#print(__file__)# os.path.abspath(__file__) 获取当前程序的绝对路径print(os.path.abspath(__file__))# E:\my python study\day4\Atm\bin\atm.pyPathos.path.abspath(__file__)# print(o…

python 安装虚拟环境virtualenv

1.sudo apt install virtualenv 安装失败 2.sudo apt-get update 更新失败 提示&#xff1a; E: 仓库 “http://mirrors.aliyun.com/ubuntu artful Release” 不再含有 Release 文件。N: 无法安全地用该源进行更新&#xff0c;所以默认禁用该源。N: 参见 apt-secure(8) 手册以了…

python内存管理_Python内存管理(一):预备知识

一、内存的理解你可以将计算机中的内存理解为一本为短期存储而设计的书。这本书中现在什么都没写&#xff0c;但最终不同的“作者”会来寻求空间&#xff0c;写入他们想写的故事。由于他们之间不能彼此覆盖&#xff0c;他们在开始写入之前一定要向这本书的管理者申请&#xff0…

javacv 人脸检测_使用JavaCV进行手和手指检测

javacv 人脸检测这篇文章是Andrew Davison博士发布的有关自然用户界面&#xff08;NUI&#xff09;系列的一部分&#xff0c;内容涉及使用JavaCV从网络摄像头视频提要中检测手。 注意&#xff1a;本章的所有源代码都可以从http://fivedots.coe.psu.ac.th/~ad/jg/nui055/下载。…

vector赋值的常见错误

易范错误1&#xff1a; vector<int> a; for (int i 0; i<10; i) a[i] i; //这种做法以及类似的做法都是错误的。下标只能用于获取已存在的元素&#xff0c;而现在的a[i]还是空的对象 正确做法1&#xff1a; vector<int> a; for (int i 0; i<10; i) a&…

python的pandas库中如何计算每列出现最多的值_Python Pandas中根据列的值选取多行数据...

Pandas中根据列的值选取多行数据# 选取等于某些值的行记录 用 df.loc[df[column_name] some_value]# 选取某列是否是某一类型的数值 用 isindf.loc[df[column_name].isin(some_values)]# 多种条件的选取 用 &df.loc[(df[column] some_value) & df[other_column].isin…

补码运算。

一.补码加法。 先求出两个数的补码。补码相加。最后的结果为补码&#xff0c;若要取得真值需再次求补。超过模的进位需丢掉。二.补码减法。 三.溢出检测 转载于:https://www.cnblogs.com/Ravenzzz/p/10930014.html

Oracle JDK 9 Early Access文档已更新

Raymond Gallardo在2017年4月4日发布的针对Oracle JDK 9的抢先体验文档 已更新&#xff0c;今天宣布对Oracle JDK9文档的抢先体验页面进行了更新。 Gallardo重点介绍了一些更新的部分&#xff0c;包括Oracle JDK 9的新增功能 &#xff0c; Oracle JDK 9迁移指南 &#xff0c; H…

python 读取当前文件夹下所有后缀为.lib文件

# -*- coding: utf-8 -*-import os def file_name(file_dir):for root, dirs, files in os.walk(file_dir):#print(root) # 当前目录路径#print(dirs) # 当前路径下所有子目录print(files) # 当前路径下所有非目录子文件file_name(file_dir) #输出当前文件夹下所有后缀为.li…

python分割字符串输出_python字符串分割

内置split()函数 str.split(sepNone, maxsplit-1)sep为自定义分割符&#xff0c;maxsplit为最大分割次数&#xff0c;默认值-1进行全部分割注意以下区别&#xff1a;str.split() 以空格分割&#xff0c;包括连续空格str.split( ) 同样以空格分割&#xff0c;但是不能识别连续空…