Eigen学习笔记(6)-高级初始化

原文:Eigen官网-Advanced initialization

本篇介绍几种矩阵初始化的高级方法,重点介绍逗号初始化和特殊矩阵(单位阵、零阵)。

1. 逗号初始化

(1)Eigen提供了逗号操作符允许我们方便地为矩阵/向量/数组中的元素赋值。按从左到右,从上到下的顺序列出所有元素,并用逗号进行分隔。需要注意的是,对象的尺寸需要事先指定,而且所列出的元素数目要和操作对象的尺寸大小一致。

(2)初始化列表不仅可以是数值也可以是vectors或matrices。一个常用的应用就是将不同的vector或者matrices联结到一起。需要注意的是,在使用逗号初始化方式之前必须要先设定vectors或者matrices的尺寸大小。

示例如下:

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

(3)也可以使用块结构对矩阵进行初始化。

示例如下:

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

(4)逗号表达式也可以用来对块表达式进行赋值。

示例如下:

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

2. 特殊矩阵和数组

(1)Matrix和Array类有如下一些静态方法:

方法 功能
Zero() 将所有元素初始化为0
Constant(value) 将所有元素初始化为value的值
Constant(rows, cols, value) 给定对象的大小并常量初始化
Random() 将matrix或array的元素用随机数进行初始化
Identiy() 获得单位矩阵,只能用于Matrix,不可用于Array,因为单位阵是个线性代数概念
LinSpaced(size, low, high) 只能用于vector或者一维arrays,生成一个元素数值范围在low和high之间等间距分布的向量

重点介绍一些Zero()方法,其有三种变形。
(1)Zero(),没有参数,只能用于初始化具有固定尺寸的对象。
(2)Zero(rows),有一个参数,用来初始化一维动态尺寸的对象。
(3)Zero(rows, clos),有两个参数,可以用来初始化二维对象。

示例如下:

// Zero()
std::cout << "A fixed-size array:\\n";
Array33f a1 = Array33f::Zero();
std::cout << a1 << "\\n\\n";
std::cout << "A one-dimensional dynamic-size array:\\n";
ArrayXf a2 = ArrayXf::Zero(3);
std::cout << a2 << "\\n\\n";
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

示例如下:

// LinSpaces()
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    Cosine\\n";
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

(2)Eigen也提供可同样功能的函数:setZero(), MatrixBase::setIdentity()和 DenseBase::setLinSpaced()。

示例如下:

const int size = 6;
MatrixXd mat1(size, size);
mat1.topLeftCorner(size/2, size/2)     = MatrixXd::Zero(size/2, size/2);
mat1.topRightCorner(size/2, size/2)    = MatrixXd::Identity(size/2, size/2);
mat1.bottomLeftCorner(size/2, size/2)  = MatrixXd::Identity(size/2, size/2);
mat1.bottomRightCorner(size/2, size/2) = MatrixXd::Zero(size/2, size/2);
std::cout << mat1 << std::endl << std::endl;
MatrixXd mat2(size, size);
mat2.topLeftCorner(size/2, size/2).setZero();
mat2.topRightCorner(size/2, size/2).setIdentity();
mat2.bottomLeftCorner(size/2, size/2).setIdentity();
mat2.bottomRightCorner(size/2, size/2).setZero();
std::cout << mat2 << std::endl << std::endl;
MatrixXd mat3(size, size);
mat3 << MatrixXd::Zero(size/2, size/2), MatrixXd::Identity(size/2, size/2),
        MatrixXd::Identity(size/2, size/2), MatrixXd::Zero(size/2, size/2);
std::cout << mat3 << std::endl;

结果如下:

0 0 0 1 0 0
0 0 0 0 1 0
0 0 0 0 0 1
1 0 0 0 0 0
0 1 0 0 0 0
0 0 1 0 0 0

0 0 0 1 0 0
0 0 0 0 1 0
0 0 0 0 0 1
1 0 0 0 0 0
0 1 0 0 0 0
0 0 1 0 0 0

0 0 0 1 0 0
0 0 0 0 1 0
0 0 0 0 0 1
1 0 0 0 0 0
0 1 0 0 0 0
0 0 1 0 0 0

3. 表达式变量

上面的静态方法如 Zero()、Constant()并不是直接返回一个矩阵或数组,实际上它们返回的是是‘expression object’,只是临时被使用/被用于优化。

m = (m + MatrixXd::Constant(3,3,1.2)) * 50;

MatrixXf::Constant(3,3,1.2)构建的是一个3*3的矩阵表达式(临时变量)。

逗号初始化的方式也可以构建这种临时变量,这时为了获取真正的矩阵需要调用finished()函数:

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

参考:

“Eigen教程(6)”

© 版权声明
THE END
喜欢就支持一下吧
点赞875 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容