简介

这里将讨论一下高级些的矩阵初始化方法。

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初始化相关推荐

  1. Eigen入门之密集矩阵 7 - Map class:连接Eigen与C++的数据

    简介 本文介绍一下Dense Matrix如何与c/C++的数组进行交互操作,这在引入其他的库中的vector向量和矩阵到Eigen中时要使用到的技术. 有时,你有一些定义好的数据,可能是数组,你需要 ...

  2. Eigen入门之密集矩阵 6 - Reductions, visitors and broadcasting

    简介 本文介绍一下Dense Matrix的3中操作: reduction, visitor, broadcasting. 归约计算reduction. Eigen的归约计算是这样的一类计算,它是对矩 ...

  3. Eigen入门之密集矩阵 9 - 别名混乱Aliasing

    简介 别名混乱Aliasing是指在赋值表达式中,一个Eigen对象(矩阵.数组.向量)同时出现在左值和右值表达式中,比如v = v*2; m = m.transpose();; 别名混乱会引起错误, ...

  4. Eigen入门之密集矩阵 3 - Array操作

    简介 在Eigen内,有Matrix,vector进行线性代数的相关运算,但也需要执行对矩阵内的系数的相关操作时,这是正常的功能需求.Eigen中的Array类就是满足此需求的. Array 定义 和 ...

  5. Eigen入门之密集矩阵 10 - 矩阵的行优先及列优先存储

    简介 本篇介绍Eigen中矩阵及二维数组的系数存储顺序–行优先及列优先,已经如何指定优先顺序. 行优先(row-majoe). 列优先(column-majoe) 矩阵的系数条目组成了一个二维的结构, ...

  6. Eigen入门之密集矩阵 8 - resharp slicing切片

    简介 Eigen还没有提供resharp或者slicing的处理函数,但是,可以使用Map 类来实现这些功能. 实现resharp 操作Resharp及修改Matrix的维度大小,而其系数保持不变.R ...

  7. Eigen入门之密集矩阵 4 - 块操作

    简介 Eigen 中Matrix/Array提供了.block()来进行block区块操作,这是面向系数提供的操作功能. 语法 Eigen中提供了2种语法,针对产生的结果是一致的.但存在性能上的不同, ...

  8. Eigen入门之密集矩阵 2-- Matrix及Vector的计算方法

    简介 Eigen内的Matrix和Vector提供了类似C++的运算符,如+,-,*:也提供了编程的函数方法,如点乘和叉乘的dot(), cross(),如此等等. 在Eigen的Matrix类,代表 ...

  9. Eigen入门之密集矩阵 1 -- 类Matrix介绍

    简介 本篇介绍Eigen中的Matrix类.在Eigen中,矩阵和向量的类型都用Matrix来表示.向量是一种特殊的矩阵,其只有一行或者一列. Matrix构造 在Matrix.h中,定义了Matri ...

最新文章

  1. xp改mac地址linux,局域网络必备-mac地址修改
  2. git 创建 本地 裸 仓库
  3. kafka整理笔记笔记
  4. Lua中的模块和使用
  5. java8默认垃圾回收器,Java 8的默认垃圾收集器
  6. 【2018ACM山东省赛 - E】Sequence(树状数组,思维,优化)
  7. css div中文字位置_计算机二级Web(4):CSS基础 (上)
  8. 基于tkinter模块创建GUI程序(python)
  9. 实用分层模板,分分钟了解UI界面设计基本原则!
  10. 总结better-scroll插件的使用
  11. ubuntu 黑体_Ubuntu 10.04下安装字体最简单的方法
  12. Spark作业提交流程
  13. 用SDK包开发K66FX18学习笔记(4)
  14. vue开发微信公众号调用相机和相册(上传到自己的服务器)
  15. c语言启动程序句柄无效,U盘上打开EXE文件提示句柄无效
  16. 【通知】有三AI淘宝店开张了,欢迎来逛
  17. 2018传智黑马前端视频教程
  18. 微信小程序与蓝牙模块通信注意事项
  19. 职业成长微习惯(一):随手记录工作日志
  20. Java开发者XML基础(一)

热门文章

  1. poj1942(求组合数)
  2. [20180816]校内模拟赛
  3. LiveVideoStackCon 2017 Day 1 专场回顾 —— 多媒体与浏览器专场
  4. 微信小程序实践_3点击版面图片获取新闻链接
  5. Immutable 详解及 React 中实践
  6. c# 读取机器CPU信息,硬盘信息,网卡信息
  7. vc++ List Control控件获得所有选中行的序号
  8. 思科认证36个热门考点汇总
  9. java程序运行必须得三个io类_Java基础知识(三)
  10. 用计算机画关于科技的画,用计算机鉴识画作