Eigen入门之密集矩阵 5 - 再谈Matrix初始化
简介
这里将讨论一下高级些的矩阵初始化方法。
comma-initializer
逗号初始化器 comma-initializer
方法很简单,可以一下把矩阵/向量的系数全部设置完。语法很简单,使用逗号分隔每个系数。前面的介绍文档中已经多次使用了。只是要求在前面定义对象时,要知道矩阵/向量的维度和大小,赋值时注意数量要匹配。
而且,在初始化时,逗号分隔的对象可以时矩阵或者向量。
结合前面介绍的各种操作,综合示例:
//matrix_initial1.cpp
#include <Eigen/Dense>
#include <iostream>using namespace std;
using namespace Eigen;int main()
{RowVectorXd vec1(3);vec1 << 1, 2, 3;cout << "vec1 = " << vec1 << endl;RowVectorXd vec2(4);vec2 << 1, 4, 9, 16;cout << "vec2 = " << vec2 << endl;RowVectorXd joined(7);joined << vec1, vec2;cout << "joined = " << joined << endl;cout << "-----------------------" << endl;MatrixXf m(3,3);m << 1,2,3,4,5,6,7,8,9;cout << "Here is the initialed matrix m:" << endl << m << endl;//Matrix3f mf;mf.row(0) << 1, 2, 3;mf.block(1,0,2,2) << 4, 5, 7, 8;mf.col(2).tail(2) << 6, 9; cout << "Here is the other initialed matrix mf:" << endl << mf << endl;}
执行:
$ g++ -I /usr/local/include/eigen3 matrix_initial1.cpp -o matrix_initial1
$
$ ./matrix_initial1
vec1 = 1 2 3
vec2 = 1 4 9 16
joined = 1 2 3 1 4 9 16
-----------------------
Here is the initialed matrix m:
1 2 3
4 5 6
7 8 9
Here is the other initialed matrix mf:
1 2 3
4 5 6
7 8 9
特别的矩阵和数组
Zero
Eigen内的Matrix和Array类有一些特殊的方法,比如Zero(),可以把所有的系数初始化为0。
zero方法有3中变体:
- 对固定尺寸大小的对象:不需要参数,如直接
Array33f a = matrix3f.Zero();
- 对动态尺寸大小的一维对象:需要一个参数。如
ArrayXf a = ArrayXf::Zero(3);
- 对动态尺寸大小的二维对象: 需要2个参数。如
ArrayXXf a = ArrayXXf::Zero(3, 4);
Constant & Random
类似于zero,静态static方法Constant(value)将把所有的系数设置为指定的value值。如果要指定尺寸大小,则使用MatrixXd::Constant(rows, cols, value).
初始化时指定尺寸。
而Random会将对象填充随机值。
单位矩阵Identity & LinSpaced
单位矩阵,顾名思义,只是产生矩阵的。
而 LinSpaced(size, low, high) ,只用于向量vector或者一维的Array数组。它会使用low到high之间的值,按照size,平均数值间距,得到各个系数,创建向量/数组。
其他辅助方法
Eigen定义了辅助方法,用于上述的方法的对应方法: setZero(), MatrixBase::setIdentity() and DenseBase::setLinSpaced() to do this conveniently.
。
示例
请参考示例。
//matrix_initial3.cpp#include <Eigen/Dense>
#include <iostream>using namespace std;
using namespace Eigen;int main()
{// ArrayXXf table(10, 4);table.col(0) = ArrayXf::LinSpaced(10, 0, 99);table.col(1) = M_PI / 180 * table.col(0);table.col(2) = table.col(1).sin();table.col(3) = table.col(1).cos();cout << " Degrees Radians Sine Cosine\n";cout << table << endl;//cout << "-------------------------------" << endl;// 快捷方法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);cout << " mat1 "<< endl;cout << mat1 << endl << 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();cout << " mat2 "<< endl;cout << mat2 << endl << 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);cout << " mat3 "<< endl;cout << mat3 << endl;}
执行结果:
$ g++ -I /usr/local/include/eigen3 matrix_initial3.cpp -o matrix_initial3
$
$ ./matrix_initial3Degrees Radians Sine Cosine0 0 0 111 0.191986 0.190809 0.98162722 0.383972 0.374607 0.92718433 0.575959 0.544639 0.83867144 0.767945 0.694658 0.7193455 0.959931 0.819152 0.57357666 1.15192 0.913545 0.40673777 1.3439 0.97437 0.22495188 1.53589 0.999391 0.034899599 1.72788 0.987688 -0.156434
-------------------------------mat1
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 0mat2
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 0mat3
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
临时对象及Finish()
在上面的示例,Zero() , Constant()
可以在声明一个便利时,初始化对象; 也可以作为右值用来做赋值操作。看起来,好像它们会返回一个对象(矩阵或者数组)。但实际上,它们返回的是一个表达式对象(expression object),然后在需要时,才会对该表达式进行求值。这样对性能不会产生什么不好的影响。在前面的示例中,也有这样的情况。
比如代码:
MatrixXd m = MatrixXd::Random(3,3);
m = (m + MatrixXd::Constant(3,3,1.2))*10;
代码中的m + MatrixXd::Constant(3,3,1.2)
,创建了一个3X3的,系数都为1.2的常量矩阵,这时为express-object
,在和m进行矩阵加法运算时,才会真正求职计算。
而下面的逗号初始化器使用也是如此,其构造了一个临时对象,是一个2X3的随机矩阵,然后在输出时,被求值得到结果。最重要的是mat = (MatrixXf(2,2) << 0, 1, 1, 0).finished() * mat;
,在里面有一个反对角单位矩阵:KaTeX parse error: No such environment: smallmatrix at position 14: \bigl[ \begin{̲s̲m̲a̲l̲l̲m̲a̲t̲r̲i̲x̲}̲ 0 & 1 \\ 1 & 0…。这里的.finish()
是必须的,表示需要对表达式对象进行求值。
这是一个2X2的单位对角矩阵乘以2X3的矩阵:
//matrix_initial4.cpp
#include <Eigen/Dense>
#include <iostream>using namespace std;
using namespace Eigen;int main()
{// random matrix.MatrixXf mat = MatrixXf::Random(2, 3);std::cout <<" random matrix: " << endl << mat << std::endl << std::endl;////mat = (MatrixXf(2,2) << 0, 1, 1, 0) * mat; // compile error: invalid operands to binary expressionmat = (MatrixXf(2,2) << 0, 1, 1, 0).finished() * mat;std::cout << " new matrix: " << endl << mat << std::endl;
}
执行结果:
$ g++ -I /usr/local/include/eigen3 matrix_initial4.cpp -o matrix_initial4
$
$ ./matrix_initial4random matrix: -0.999984 0.511211 0.0655345-0.736924 -0.0826997 -0.562082new matrix: -0.736924 -0.0826997 -0.562082-0.999984 0.511211 0.0655345
Eigen入门之密集矩阵 5 - 再谈Matrix初始化相关推荐
- Eigen入门之密集矩阵 7 - Map class:连接Eigen与C++的数据
简介 本文介绍一下Dense Matrix如何与c/C++的数组进行交互操作,这在引入其他的库中的vector向量和矩阵到Eigen中时要使用到的技术. 有时,你有一些定义好的数据,可能是数组,你需要 ...
- Eigen入门之密集矩阵 6 - Reductions, visitors and broadcasting
简介 本文介绍一下Dense Matrix的3中操作: reduction, visitor, broadcasting. 归约计算reduction. Eigen的归约计算是这样的一类计算,它是对矩 ...
- Eigen入门之密集矩阵 9 - 别名混乱Aliasing
简介 别名混乱Aliasing是指在赋值表达式中,一个Eigen对象(矩阵.数组.向量)同时出现在左值和右值表达式中,比如v = v*2; m = m.transpose();; 别名混乱会引起错误, ...
- Eigen入门之密集矩阵 3 - Array操作
简介 在Eigen内,有Matrix,vector进行线性代数的相关运算,但也需要执行对矩阵内的系数的相关操作时,这是正常的功能需求.Eigen中的Array类就是满足此需求的. Array 定义 和 ...
- Eigen入门之密集矩阵 10 - 矩阵的行优先及列优先存储
简介 本篇介绍Eigen中矩阵及二维数组的系数存储顺序–行优先及列优先,已经如何指定优先顺序. 行优先(row-majoe). 列优先(column-majoe) 矩阵的系数条目组成了一个二维的结构, ...
- Eigen入门之密集矩阵 8 - resharp slicing切片
简介 Eigen还没有提供resharp或者slicing的处理函数,但是,可以使用Map 类来实现这些功能. 实现resharp 操作Resharp及修改Matrix的维度大小,而其系数保持不变.R ...
- Eigen入门之密集矩阵 4 - 块操作
简介 Eigen 中Matrix/Array提供了.block()来进行block区块操作,这是面向系数提供的操作功能. 语法 Eigen中提供了2种语法,针对产生的结果是一致的.但存在性能上的不同, ...
- Eigen入门之密集矩阵 2-- Matrix及Vector的计算方法
简介 Eigen内的Matrix和Vector提供了类似C++的运算符,如+,-,*:也提供了编程的函数方法,如点乘和叉乘的dot(), cross(),如此等等. 在Eigen的Matrix类,代表 ...
- Eigen入门之密集矩阵 1 -- 类Matrix介绍
简介 本篇介绍Eigen中的Matrix类.在Eigen中,矩阵和向量的类型都用Matrix来表示.向量是一种特殊的矩阵,其只有一行或者一列. Matrix构造 在Matrix.h中,定义了Matri ...
最新文章
- xp改mac地址linux,局域网络必备-mac地址修改
- git 创建 本地 裸 仓库
- kafka整理笔记笔记
- Lua中的模块和使用
- java8默认垃圾回收器,Java 8的默认垃圾收集器
- 【2018ACM山东省赛 - E】Sequence(树状数组,思维,优化)
- css div中文字位置_计算机二级Web(4):CSS基础 (上)
- 基于tkinter模块创建GUI程序(python)
- 实用分层模板,分分钟了解UI界面设计基本原则!
- 总结better-scroll插件的使用
- ubuntu 黑体_Ubuntu 10.04下安装字体最简单的方法
- Spark作业提交流程
- 用SDK包开发K66FX18学习笔记(4)
- vue开发微信公众号调用相机和相册(上传到自己的服务器)
- c语言启动程序句柄无效,U盘上打开EXE文件提示句柄无效
- 【通知】有三AI淘宝店开张了,欢迎来逛
- 2018传智黑马前端视频教程
- 微信小程序与蓝牙模块通信注意事项
- 职业成长微习惯(一):随手记录工作日志
- Java开发者XML基础(一)