【Eigen】 3.4.90 库快速参考Dense matrix and array manipulation

Dense matrix and array manipulation

密集矩阵和数组操作

模块和头文件

Eigen库被划分为一个核心模块和若干附加模块。每个模块都有一个对应的头文件,需要包含该头文件才能使用该模块。Dense和Eigen头文件提供了一种方便的方式来一次性访问多个模块。

模块头文件内容
Core#include <Eigen/Core>矩阵和数组类,基础线性代数(包括三角形和自伴积),数组操作
Geometry#include <Eigen/Geometry>变换,平移,缩放,2D和3D旋转(四元数,角轴)
LU#include <Eigen/LU>逆,行列式,LU分解和求解器(FullPivLU,PartialPivLU)
Cholesky#include <Eigen/Cholesky>LLT和LDLT Cholesky分解和求解器
Householder#include <Eigen/Householder>Householder变换;此模块被多个线性代数模块使用
SVD#include <Eigen/SVD>SVD分解和最小二乘求解器(JacobiSVD,BDCSVD)
QR#include <Eigen/QR>QR分解和求解器(HouseholderQR,ColPivHouseholderQR,FullPivHouseholderQR)
Eigenvalues#include <Eigen/Eigenvalues>特征值,特征向量分解(EigenSolver,SelfAdjointEigenSolver,ComplexEigenSolver)
Sparse#include <Eigen/Sparse>稀疏矩阵存储和相关基础线性代数(SparseMatrix,SparseVector)(参见稀疏矩阵快速参考指南以获取有关稀疏模块的详细信息)
Dense#include <Eigen/Dense>包括Core,Geometry,LU,Cholesky,SVD,QR和Eigenvalues头文件
Eigen#include <Eigen/Eigen>包括Dense和Sparse头文件(整个Eigen库)

数组,矩阵和向量类型 

回顾:Eigen提供了两种类型的密集对象:数学矩阵和向量,它们都由模板类Matrix表示,以及由模板类Array表示的通用1D和2D数组:

typedef Matrix<Scalar, RowsAtCompileTime, ColsAtCompileTime, Options> MyMatrixType;
typedef Array<Scalar, RowsAtCompileTime, ColsAtCompileTime, Options> MyArrayType;

Scalar是系数的标量类型(例如,float,double,bool,int等)。RowsAtCompileTime和ColsAtCompileTime是在编译时已知的矩阵的行数和列数,或者是Dynamic。Options可以是ColMajor或RowMajor,默认是ColMajor。(参见Matrix类以获取更多选项) 所有组合都是允许的:你可以有一个具有固定行数和动态列数的矩阵,等等。以下都是有效的:

Matrix<double, 6, Dynamic>                  // 动态列数(堆分配)
Matrix<double, Dynamic, 2>                  // 动态行数(堆分配)
Matrix<double, Dynamic, Dynamic, RowMajor>  // 完全动态,行优先(堆分配)
Matrix<double, 13, 3>                       // 完全固定(通常在栈上分配)

在大多数情况下,你可以简单地使用矩阵和数组的便捷typedef之一。一些例子:

MatricesArrays

Matrix<float,Dynamic,Dynamic>   <=>   MatrixXf

Matrix<double,Dynamic,1>        <=>   VectorXd

Matrix<int,1,Dynamic>           <=>   RowVectorXi

Matrix<float,3,3>               <=>   Matrix3f

Matrix<float,4,1>               <=>   Vector4f

Array<float,Dynamic,Dynamic>    <=>   ArrayXXf

Array<double,Dynamic,1>         <=>   ArrayXd

Array<int,1,Dynamic>            <=>   RowArrayXi

Array<float,3,3>                <=>   Array33f

Array<float,4,1>                <=>   Array4f

矩阵和数组之间的转换:

Array44f a1, a2;
Matrix4f m1, m2;
m1 = a1 * a2;                     // 系数乘积,从数组到矩阵的隐式转换。
a1 = m1 * m2;                     // 矩阵乘积,从矩阵到数组的隐式转换。
a2 = a1 + m1.array();             // 混合数组和矩阵是禁止的
m2 = a1.matrix() + m1;            // 需要显式转换。
ArrayWrapper<Matrix4f> m1a(m1);   // m1a是m1.array()的别名,它们共享相同的系数
MatrixWrapper<Array44f> a1m(a1);

在本文档的其余部分,我们将使用以下符号来强调给定对象类型的特定特性:

  • 仅线性代数矩阵和向量

  • 仅数组对象

Basic matrix manipulation 基本矩阵操作

7961bb8235aa8ac081c908f79ef04c19.png

Predefined Matrices 预定义矩阵

Fixed-size matrix or vector

028cb0029754b81d2d95a02813da369b.png

41d0c96af912f1a36b851dc068c62a66.png

a9e7a3736210c4f4747a3903dd700603.png

Identity and basis vectors *

16bc43f68c6406e2af68c56f6bc45d37.png

请注意,可以在不传递新尺寸的情况下,对动态大小的向量或矩阵调用任何set*函数。例如:

MatrixXi M(3,3);
M.setIdentity();

Mapping external arrays映射外部数组

连续内存

float data[] = {1,2,3,4};
Map<Vector3f> v1(data);       // uses v1 as a Vector3f object
Map<ArrayXf>  v2(data,3);     // uses v2 as a ArrayXf object
Map<Array22f> m1(data);       // uses m1 as a Array22f object
Map<MatrixXf> m2(data,2,2);   // uses m2 as a MatrixXf object

步幅的典型用法

float data[] = {1,2,3,4,5,6,7,8,9};
Map<VectorXf,0,InnerStride<2> >  v1(data,3);                      // = [1,3,5]
Map<VectorXf,0,InnerStride<> >   v2(data,3,InnerStride<>(3));     // = [1,4,7]
Map<MatrixXf,0,OuterStride<3> >  m2(data,2,3);                    // both lines     |1,4,7|
Map<MatrixXf,0,OuterStride<> >   m1(data,2,3,OuterStride<>(3));   // are equal to:  |2,5,8|

算术运算符

264097b4211f046b3f552dfb71d45622.png

Coefficient-wise & Array operators系数逐元素和数组运算符

除了上述运算符外,Eigen还支持许多系数逐元素的运算符和函数。它们中的大多数在数组世界中都有明确的含义。以下运算符可直接用于数组,或通过 .array() 用于向量和矩阵:

算术运算符

array1 * array2     array1 / array2     array1 *= array2    array1 /= array2
array1 + scalar     array1 - scalar     array1 += scalar    array1 -= scalar

比较

array1 < array2     array1 > array2     array1 < scalar     array1 > scalar
array1 <= array2    array1 >= array2    array1 <= scalar    array1 >= scalar
array1 == array2    array1 != array2    array1 == scalar    array1 != scalar
array1.min(array2)  array1.max(array2)  array1.min(scalar)  array1.max(scalar)

三角函数,幂函数和其他函数 以及类似STL的变体

array1.abs2()
array1.abs()                  abs(array1)
array1.sqrt()                 sqrt(array1)
array1.log()                  log(array1)
array1.log10()                log10(array1)
array1.exp()                  exp(array1)
array1.pow(array2)            pow(array1,array2)
array1.pow(scalar)            pow(array1,scalar)
                              pow(scalar,array2)
array1.square()
array1.cube()
array1.inverse()
 
array1.sin()                  sin(array1)
array1.cos()                  cos(array1)
array1.tan()                  tan(array1)
array1.asin()                 asin(array1)
array1.acos()                 acos(array1)
array1.atan()                 atan(array1)
array1.sinh()                 sinh(array1)
array1.cosh()                 cosh(array1)
array1.tanh()                 tanh(array1)
array1.arg()                  arg(array1)
 
array1.floor()                floor(array1)
array1.ceil()                 ceil(array1)
array1.round()                round(aray1)
 
array1.isFinite()             isfinite(array1)
array1.isInf()                isinf(array1)
array1.isNaN()                isnan(array1)

以下系数逐元素运算符可用于所有类型的表达式(矩阵,向量和数组),适用于实数或复数标量类型:

d2f9d1aaff45a02a18537d533d8d08db.png

一些系数逐元素运算符通过以下的 cwise* 方法可以直接用于矩阵和向量:

79c23dc1951f20496ab958d3d18f7a62.png

这两种 API 的主要区别在于,基于 cwise* 方法的返回一个矩阵世界中的表达式,而基于 .array() 的返回一个数组表达式。请记住,.array() 没有任何成本,它只改变了可用的 API 和数据的解释。

使用 DenseBase::unaryExpr 以及 std::ptr_fun (c++03, 在新的 C++ 版本中已被弃用或删除),std::ref (c++11),或者 lambdas (c++11) 应用任何用户定义的函数 foo 也非常简单

mat1.unaryExpr(std::ptr_fun(foo));
mat1.unaryExpr(std::ref(foo));
mat1.unaryExpr([](double x) { return foo(x); });

请注意,无法将原始函数指针传递给 unaryExpr,所以请按照上面的示例进行包装

Reductions缩减

缩减 Eigen 提供了几种缩减方法,例如:minCoeff(),maxCoeff(),sum(),prod(),trace(),norm(),squaredNorm()*,all(),和 any()。所有的缩减操作都可以在矩阵级别,列级别或行级别进行。使用示例:

350cda4fa4b3e434c4dd5223de4222ce.png

minCoeff 和 maxCoeff 的特殊版本:

int i, j;
s = vector.minCoeff(&i);        // s == vector[i]
s = matrix.maxCoeff(&i, &j);    // s == matrix(i,j)

all() 和 any() 的典型用例:

if((array1 > 0).all()) ...      // if all coefficients of array1 are greater than 0 ...
if((array1 < array2).any()) ... // if there exist a pair i,j such that array1(i,j) < array2(i,j) ...

子矩阵Sub-matrices

请帮助我们改进此部分。Eigen 3.4 支持用于子矩阵的大幅改进的 API,包括从数组进行切片和索引:切片和索引 对矩阵(或数组)的一列或一行的读写访问:

mat1.row(i) = mat2.col(j);
mat1.col(j1).swap(mat1.col(j2));

对子向量的读写访问:

4f7f86c576b4c76aabcb378f27975e5d.png

Miscellaneous operations杂项操作

请帮助我们改进此部分 Eigen 3.4支持用于重塑的新API:: Reshape

Reverse 反转

可以反转矩阵的向量、行和/或列(参见DenseBase::reverse(),DenseBase::reverseInPlace(),VectorwiseOp::reverse())

vec.reverse()           mat.colwise().reverse()   mat.rowwise().reverse()
vec.reverseInPlace()

Replicate 复制

可以在任何方向复制向量、矩阵、行和/或列(参见DenseBase::replicate(),VectorwiseOp::replicate())

vec.replicate(times)                                          vec.replicate<Times>
mat.replicate(vertical_times, horizontal_times)               mat.replicate<VerticalTimes, HorizontalTimes>()
mat.colwise().replicate(vertical_times, horizontal_times)     mat.colwise().replicate<VerticalTimes, HorizontalTimes>()
mat.rowwise().replicate(vertical_times, horizontal_times)     mat.rowwise().replicate<VerticalTimes, HorizontalTimes>()

Diagonal, Triangular, and Self-adjoint matrices 对角线、三角形和自伴矩阵 


对角矩阵

77ddcce4ce03b4d35a6438ec9a0bf9a3.png

三角视图 TriangularView

TriangularView提供了对密集矩阵的三角部分的视图,并允许对其进行优化操作。相对的三角部分从未被引用,可以用来存储其他信息。

注意 .triangularView()模板成员函数需要模板关键字,如果它用于一个取决于模板参数的类型的对象;参见C++中的模板和typename关键字以获取详细信息。

6cf56f2cbaf0326f0b15f374a1ffa1b9.png

Symmetric/selfadjoint views对称/自伴视图

就像对于三角矩阵一样,你可以引用任何正方形矩阵的三角部分,将其视为自伴矩阵,并进行特殊和优化的操作。同样,相对的三角部分从未被引用,可以用来存储其他信息。

注意 .selfadjointView()模板成员函数需要模板关键字,如果它用于一个取决于模板参数的类型的对象;参见C++中的模板和typename关键字以获取详细信息。

8d04bdc67f602dba4f3f3ae7f29b956d.png

http://eigen.tuxfamily.org/dox/group__QuickRefPage.html

  • 21
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值