博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Eigen教程(6)
阅读量:5113 次
发布时间:2019-06-13

本文共 3890 字,大约阅读时间需要 12 分钟。

整理下Eigen库的教程,参考:

高级初始化方法

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

逗号初始化

Eigen提供了逗号操作符允许我们方便地为矩阵/向量/数组中的元素赋值。顺序是从左上到右下:自左到右,从上至下。对象的尺寸需要事先指定,初始化的参数也应该和要操作的元素数目一致。

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

初始化列表不仅可以是数值也可以是vectors或matrix。

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 3vec2 =  1  4  9 16joined =  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.40.1 0.2   1   20.3 0.4   3   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 34 5 67 8 9

特殊的矩阵和向量

零阵:类的静态成员函数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 00 0 00 0 0A one-dimensional dynamic-size array:000A two-dimensional dynamic-size array:0 0 0 00 0 0 00 0 0 0

类似地,还有常量矩阵:Constant([rows],[cols],value),Random()随机矩阵。

单位阵Identity()方法只能使用与Matrix不使用Array,因为单位阵是个线性代数概念。

LinSpaced(size, low, high)可以从low到high等间距的size长度的序列,适用于vector和一维数组。

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

功能函数

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 00 0 0 0 1 00 0 0 0 0 11 0 0 0 0 00 1 0 0 0 00 0 1 0 0 0

三种赋值(初始化)的方式逗号初始化、特殊阵的静态方法和功能函数setXxx()。

表达式变量

上面的静态方法如 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

转载于:https://www.cnblogs.com/houkai/p/6351358.html

你可能感兴趣的文章
App研发录得源码
查看>>
Nodejs sublime text 3安装与配置
查看>>
《转》Python学习(18)-python函数(二)
查看>>
awk应用场景之过滤举例
查看>>
编译与链接的简单过程小结
查看>>
119 - Greedy Gift Givers
查看>>
[置顶] 可选参数及命名实参在一起
查看>>
Integer Inquiry_hdu_1047(大数).java
查看>>
uva 387 A Puzzling Problem (回溯)
查看>>
K均值算法实现
查看>>
js时间戳与日期格式之间相互转换
查看>>
python全栈之路系列之赋值与运算符
查看>>
剑指offer--4.重建二叉树
查看>>
this指针基础介绍
查看>>
如何把checkbox做成radio一样的单选效果
查看>>
分享:将业务系统页面嵌入到统一平台中(简易版)
查看>>
我要学习Python
查看>>
toad连接数据库
查看>>
Convert recaf.jar file to recaf.dmg setup package on MacOS
查看>>
tp5之行为监听、钩子行为的绑定与侦听
查看>>