我是靠谱客的博主 懵懂麦片,最近开发中收集的这篇文章主要介绍Eigen 学习文档: 高级初始化高级初始化,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

高级初始化

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

逗号初始化

Eigen提供了一个逗号初始化语法,允许用户轻松设置矩阵、向量或数组的所有元素。简单地列出元素,从左上角开始,从左到右,从上到下。需要事先指定对象的大小。如果你列出的元素太少或太多,Eigen会抱怨 laughing

Matrix3f m;
m << 1, 2, 3,
     4, 5, 6,
     7, 8, 9;
std::cout << m;
# 输出:
1 2 3
4 5 6
7 8 9

此外,初始化列表的元素本身可以是向量或矩阵。一个常见的用法是将向量或矩阵连接在一起。

例如,这里是如何将两个行向量连接在一起。请记住,必须先设置大小,然后才能使用逗号初始值设定项。

RowVectorXd vec1(3);
vec1 << 1, 2, 3;
std::cout << "vec1 = " << vec1 << std::endl;
 
RowVectorXd vec2(4);
vec2 << 1, 4, 9, 16;
std::cout << "vec2 = " << vec2 << std::endl;
 
RowVectorXd joined(7);
joined << vec1, vec2;
std::cout << "joined = " << joined << std::endl;
# 输出:
vec1 = 1 2 3
vec2 =  1  4  9 16
joined =  1  2  3  1  4  9 16

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

MatrixXf matA(2, 2);
matA << 1, 2, 3, 4;
MatrixXf matB(4, 4);
matB << matA, matA/10, matA/10, matA;
std::cout << matB << std::endl;
# 输出:
  1   2 0.1 0.2
  3   4 0.3 0.4
0.1 0.2   1   2
0.3 0.4   3   4

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

Matrix3f m;
m.row(0) << 1, 2, 3;
m.block(1,0,2,2) << 4, 5, 7, 8;
m.col(2).tail(2) << 6, 9;                   
std::cout << m;
# 输出:
1 2 3
4 5 6
7 8 9

特殊矩阵和数组

MatrixArray类具有诸如Zero()之类的静态方法,可用于将所有元素初始化为零。有三种变体。第一个变体不带参数,只能用于固定大小的对象。如果要将动态大小的对象初始化为零,则需要指定大小。因此,第二个变体需要一个参数并且可以用于一维动态大小的对象,而第三个变体需要两个参数并且可以用于二维对象。以下示例说明了所有三种变体:

std::cout << "A fixed-size array:n";
Array33f a1 = Array33f::Zero();
std::cout << a1 << "nn";
 
std::cout << "A one-dimensional dynamic-size array:n";
ArrayXf a2 = ArrayXf::Zero(3);
std::cout << a2 << "nn";
 
std::cout << "A two-dimensional dynamic-size array:n";
ArrayXXf a3 = ArrayXXf::Zero(3, 4);
std::cout << a3 << "n";
# 输出:
A fixed-size array:
0 0 0
0 0 0
0 0 0

A one-dimensional dynamic-size array:
0
0
0

A two-dimensional dynamic-size array:
0 0 0 0
0 0 0 0
0 0 0 0

同样,静态方法Constant(value) 将所有元素设置为value。如果需要指定对象的大小,则附加参数位于value参数之前,如MatrixXd::Constant(rows, cols, value). 方法Random()用随机元素填充矩阵或数组。单位矩阵可以通过调用Identity()获得;此方法仅适用于Matrix,不适用于Array,因为“单位矩阵”是线性代数概念。LinSpaced (size, low ,high)方法只适用于向量和一维数组;它产生一个指定大小的向量,其元素在low和之间等距分布high。方法LinSpaced()在以下示例中进行了说明,该示例打印了一个以度为单位的角度、以弧度为单位的相应角度以及它们的正弦和余弦的表格。

ArrayXXf table(10, 4);
table.col(0) = ArrayXf::LinSpaced(10, 0, 90);
table.col(1) = M_PI / 180 * table.col(0);
table.col(2) = table.col(1).sin();
table.col(3) = table.col(1).cos();
std::cout << "  Degrees   Radians      Sine    Cosinen";
std::cout << table << std::endl;
# 输出:
  Degrees   Radians      Sine    Cosine
        0         0         0         1
       10     0.175     0.174     0.985
       20     0.349     0.342      0.94
       30     0.524       0.5     0.866
       40     0.698     0.643     0.766
       50     0.873     0.766     0.643
       60      1.05     0.866       0.5
       70      1.22      0.94     0.342
       80       1.4     0.985     0.174
       90      1.57         1 -4.37e-08

这个例子表明像 LinSpaced() 返回的对象可以分配给变量(和表达式)。Eigen定义了实用函数,如setZero()MatrixBase::setIdentity()DenseBase::setLinSpaced()来方便地执行此操作。下面的例子对比了三种构造矩阵的方式
J = [ O I I O ] J = left[ begin{matrix} O & I \ I & O \ end{matrix} right] J=[OIIO]

使用静态方法和赋值,使用静态方法和逗号初始化器,或者使用 setXxx() 方法。

用作临时对象

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

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

#include <iostream>
#include <Eigen/Dense>
 
using Eigen::MatrixXd;
using Eigen::VectorXd;
 
int main()
{
  MatrixXd m = MatrixXd::Random(3,3);
  m = (m + MatrixXd::Constant(3,3,1.2)) * 50;
  std::cout << "m =" << std::endl << m << std::endl;
  VectorXd v(3);
  v << 1, 2, 3;
  std::cout << "m * v =" << std::endl << m * v << std::endl;
}
# 输出:
m =
  94 89.8 43.5
49.4  101 86.8
88.3 29.8 37.8
m * v =
404
512
261

该表达式构造 3×3 矩阵表达式,其所有元素等于 1.2 加上相应的m元素。m + MatrixXf::Constant(3,3,1.2)

逗号初始化器也可以用来构造临时对象。下面的示例构造一个大小为 2×3 的随机矩阵,然后将左边的这个矩阵与[0110].

MatrixXf mat = MatrixXf::Random(2, 3);
std::cout << mat << std::endl << std::endl;
mat = (MatrixXf(2,2) << 0, 1, 1, 0).finished() * mat;
std::cout << mat << std::endl;
  0.68  0.566  0.823
-0.211  0.597 -0.605

-0.211  0.597 -0.605
  0.68  0.566  0.823

一旦我们的临时子矩阵的逗号初始化完成,finished()方法在此处是获取实际矩阵对象的必要条件。

最后

以上就是懵懂麦片为你收集整理的Eigen 学习文档: 高级初始化高级初始化的全部内容,希望文章能够帮你解决Eigen 学习文档: 高级初始化高级初始化所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(46)

评论列表共有 0 条评论

立即
投稿
返回
顶部