「C++: Eigen」第一章 第二节 Matrix and vector arithmetic

本文详细介绍了Eigen库中矩阵、向量的算术操作,包括加法、减法、标量乘除、转秩矩阵、共轭矩阵、矩阵乘法、点乘和叉乘以及基础算数约归运算。讲解了各种运算的适用场景和注意事项,如别名问题和就地转秩。此外,还提到了向量的约归运算,如求和、积、均值、最大最小元素及其位置。
摘要由CSDN通过智能技术生成

1.2 矩阵和向量算术

本节主要是介绍矩阵、向量和标量之间的操作和算术细节

1.2.1 简介

矩阵/向量的算术操作在Eigen中要么通过算术符号(+,-,*,/)重载,要么通过方法(.dot())实现。对于矩阵类,算术符号重载只能执行线性代数运算,例如矩阵✖️矩阵,但不能进行向量+标量(常数)的运算。

1.2.2 加法和减法

运算符号左右侧必须是相同形状的矩阵,也必须有相同的标量类型(相同元素类型),支持运算包括:

  • 双边运算:a+b
  • 单边运算:-a
  • 符合运算:-+ / +=

矩阵和向量除了可以使用逗号初始化方法,向量还可以使用C++中的括号进行初始化:

Eigen::Vector3d v(1,2,3);
Eigen::Vector3d w(1,0,0);

1.2.3 标量的乘除法

Eigen允许标量与矩阵之间进行乘除法,包括:

  • 乘法:matrix * scaler or scaler * matrix
  • 除法:matrix / scaler
  • 复合运算:matrix *= scalar

1.2.4 转秩矩阵和共轭矩阵

矩阵转秩、共轭、伴随分别调用方法transpose(), conjugate(), and adjoint()。对于实数矩阵,共轭等于本身,因此伴随矩阵等价于矩阵转秩。

对于transpose() 和 adjoint() 方法,Eigen会返回一个代理对象而不做对应处理,例如b = a.transpose()时,程序会在写入b的同时做转秩,因此就地转秩 a = a.transpose() 是不合法的操作。这被称为“别名问题”。如果要就地使用转秩,需要调用transposeInPlace()方法。

1.2.5 矩阵乘法

矩阵矩阵、矩阵向量、向量*向量均使用操作符 * 号完成

1.2.6 点乘和叉乘

点乘:点乘结果为标量,dot()方法,该方法可以用于任何维度向量
叉乘:叉乘结果为向量,cross()方法,该方法只能用于3维向量以内

1.2.7 基础算数约归运算

主要是对向量的一些约归运算:

  • sum():元素和
  • prod():元素积
  • mean():均值
  • minCoeff():最小元素
  • maxCoeff():最大元素
  • trace():迹

此外,minCoeff和maxCoeff还可以通过引用传值,返回对应元素在矩阵中的坐标:

  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;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值