Eigen官网教程 (4) 高级初始化

时间:2024-03-25 18:20:48

本页讨论了几种用于初始化矩阵的高级方法。它提供了之前介绍的逗号初始化器的更多细节。它还解释了如何获得特殊矩阵,例如单位矩阵和零矩阵。

1 逗号初始化程序

Eigen提供逗号初始化语法,允许用户轻松设置矩阵,向量或数组的所有系数。只需列出系数,从左上角开始,从左到右,从上到下移动。需要事先指定对象的大小。如果列出的系数太少或太多,Eigen会抱怨。

Eigen官网教程 (4) 高级初始化

而且,初始化列表的元素本身可以是向量或矩阵。常见的用途是将矢量或矩阵连接在一起。例如,以下是如何将两个行向量连接在一起。请记住,必须先设置大小才能使用逗号初始值设定项

Eigen官网教程 (4) 高级初始化

我们可以使用相同的技术来初始化具有块结构的矩阵。

Eigen官网教程 (4) 高级初始化

逗号初始值设定项也可用于填充块表达式,例如 m.row(i)。这是获得与上面第一个示例相同结果的更复杂方法:

Eigen官网教程 (4) 高级初始化

2.特殊矩阵和数组

2.1 矩阵阵列类具有静态方法等Zero(),其可用于所有系数初始化到零。有三种变体

第一个变量不带参数,只能用于固定大小的对象。如果要将动态大小对象初始化为零,则需要指定大小。

第二个变体需要一个参数,并且可以用于一维动态大小的对象

第三个变体需要两个参数,并且可以用于二维对象。以下示例说明了所有三种变体:

Eigen官网教程 (4) 高级初始化

2.2 类似地,静态方法Constant(value)将所有系数设置为value

如果需要指定对象的大小,则附加参数将在value参数之前,如

MatrixXd::Constant(rows, cols, value). Random()方法用随机系数填充矩阵或数组。

                                            行         列         值

可以通过调用Identity()获得单位矩阵

此方法仅适用于Matrix,不适用于Array,因为“单位矩阵”是线性代数概念。

 LinSpaced(size, low, high仅适用于向量一维数组

它产生一个指定大小的向量,其系数在lowhigh之间等间隔size。方法LinSpaced() 在下面的示例中进行了说明,该示例打印一个表格,其角度为度,相应的角度为弧度,以及它们的正弦和余弦。

Eigen官网教程 (4) 高级初始化

此示例显示可以将LinSpaced()返回的对象分配给变量(和表达式)。Eigen定义了实用函数,如setZero(),MatrixBase :: setIdentity()和DenseBase :: setLinSpaced(),可以方便地执行此操作。以下示例对比了构造矩阵的三种方法

Eigen官网教程 (4) 高级初始化

使用静态方法和赋值,         使用静态方法和逗号初始化程序,         或使用setXxx()方法

Eigen官网教程 (4) 高级初始化

3. 用作临时对象

如上所示,静态方法如Zero()和Constant()可用于在声明时或在赋值运算符的右侧初始化变量。您可以将这些方法视为返回矩阵或数组; 实际上,它们返回所谓的表达式对象,在需要时可以计算矩阵或数组,因此这种语法不会产生任何开销。

这些表达式也可以用作临时对象。

Eigen官网教程 (4) 高级初始化

Eigen官网教程 (4) 高级初始化