Eigen3学习笔记——密集矩阵和数组操作(2)

本文详细介绍了Eigen库中矩阵的加减、标量乘除、表达式模板、转置共轭伴随、矩阵乘法、点积叉积、Array类的使用、矩阵与向量的转换、块操作、切片索引、初始化方式以及矩阵的运算和范数计算。讲解了Eigen如何通过重载运算符实现高效且灵活的矩阵运算,同时强调了避免aliasing issue的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

矩阵和算数运算

Eigen 通过重载C++的算数运算符或特殊方法来进行矩阵的算数运算

加减

参与加减的矩阵要满足行列情况,并且元素数据类型也要相同,Eigen 不会自己进行数据类型转换

//这里简单给出加减法运算,注意数据矩阵的数据类型
Matrix2d a;
a << 1, 2,
	3, 4;
MatrixXd b(2,2);
b << 2, 3,
	1, 4;
//双目加法:a+b
//双目减法:a-b
//单目减法:-a
//复合加法:a+=b			//a = a + b;
//复合减法:a-=b			//a = a - b;
标量与矩阵的乘除法
Matrix2d a;
a << 1, 2,
	3, 4;
//双目乘法:a*2.5
//双目乘法:2.5*a
//双目除法:a/2.5
//复合乘法:a*=2.5
//复合除法:a/=2.5
关于表达式模板的说明

在Eigen 中,算术运算符本身是不执行任何计算,他只返回一个描述要执行的“表达式对象”,实际的计算是编译器进行优化后进行的。

说白了,不要去想象矩阵运算是怎么进行的,是按照数学上直接相加还是怎么样,不关心也没必要去知道。

转置、共轭和伴随

注意:

  1. transpose()adjoint()简单地返回一个代理对象没有做实际的换位。
  2. 尽量避免a = a.transpose()这样的操作,这种操作a 将不会发生变化,这种现象称为aliasing issue
Matrix2d a;
a << 1, 2,
	3, 4;
Matrix2d b;
a << 5, 2,
	7, 5;
a.transpose();			//转置,a取转置,但a本身不变化
a.conjugate();			//共轭
a.adjoint();			//伴随
a.transposeInPlace();	//对a 进行立即取转置,a 直接产生变化
b = a.transpose();		//结果在写入的时候同时产生转置,之前的a.transpose()只是简单的返回代理对象,并没有进行转换
a = a.transpose();		//不允许这样做,a的值将不变化。在写入a的同时还要对a进行转置,这不难为人么
矩阵乘法

注意:

  1. Eiegn将矩阵乘法当成特殊情况,不会出现aliasing issue,因为Eigen会添加一个临时变量temp = a*a
Matrix2d a;
a << 1, 2,
	3, 4;
Matrix2d b;
b << 2, 3,
	4, 5;
//双目乘法:a*b
//复合乘法:a*=b			//等价于a = a*b,注意a,b位置
//允许:a = a*a		 //可以这样写,不会产aliasing issue
点积和叉积

注意:

  1. 点积使用任意大小向量;
  2. 叉积只适用于大小为3的向量;
Ve
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值