1.3eigen中数组类和系数的运算
1.3数组类和系数的运算
与矩阵类只适用与线性代数运算相反,数组类提供通用的数组类,能不利用线性代数的知识来对系数进行操作,比如对每个系数加上一个常数,或者乘上两个数组的系数。
1.数组类型
跟矩阵类一样,数组也是一个具有相同模板参数的类模板。和矩阵类相同,前三个模板参数是必须提供实参的:
Array<typename Scalar, int RowsAtCompileTime, int ColsAtCompileTime>
后三个模板参数是选择性的。
对某些相同的情况,eigen同样也提供类型别名,但是与矩阵类有点不同的是,数组类用于一维和二维数组。依据惯例,ArrayNt表示一维数组,N表示数
组大小,t表示元素类型。对二维数组来讲,使用ArrayNNt来表示,如下所示:
Array<float,Dynamic,> ArrayXf //动态绑定的一维数组,元素类型为单精度浮点型
Array<float,,> Array3f //数组大小为3的一维数组,元素类型为单精度浮点型
Array<double,Dynamic,Dynamic> ArrayXXd//动态绑定的二维数组 ,元素类型为双精度浮点型
Array<double,,> Array33d //数组大小分别为3的二维数组,元素类型为双精度浮点型
2.访问数组元素
与矩阵一样,重载的括号运算符提供数组元素读写操作。同时<<输出运算符也能初始化数组或者打印它们。
#include <Eigen/Dense>
#include <iostream>
using namespace Eigen;
using namespace std;
int main()
{
ArrayXXf m(,);
// assign some values coefficient by coefficient
m(,) = 1.0; m(,) = 2.0;
m(,) = 3.0; m(,) = m(,) + m(,);
// print values to standard output
cout << m << endl << endl;
// using the comma-initializer is also allowed
m << 1.0,2.0,
3.0,4.0;
// print values to standard output
cout << m << endl;
}
//output
3.加减法
跟矩阵加减法一样,数组加减法只对两个数组有相同的大小有效。但是,数组能完成数组与标量的加法,这相当于数组内的所有元素都加上这个数值,这个提供了矩阵对象不能直接使用的功能。
#include <Eigen/Dense>
#include <iostream>
using namespace Eigen;
using namespace std;
int main()
{
ArrayXXf a(,);
ArrayXXf b(,);
a << ,,,
,,,
,,;
b << ,,,
,,,
,,;
// Adding two arrays两个数组相加
cout << "a + b = " << endl << a + b << endl << endl;
// Subtracting a scalar from an array一个数组减去一个数
cout << "a - 2 = " << endl << a - << endl;
}
//output
a + b = a - =
-
4.数组乘法
数组可以和数值相乘,也可以和数组相乘。但是两个数组相乘与矩阵乘法不一样,数组相乘是对应的系数相乘:
#include <Eigen/Dense>
#include <iostream>
using namespace Eigen;
using namespace std;
int main()
{
ArrayXXf a(,);
ArrayXXf b(,);
a << ,,
,;
b << ,,
,;
cout << "a * b = " << endl << a * b << endl;
}
//output
a * b =
5.系数的其他运算
数组类还提供了除了上面加减法、乘法三种运算外的其他运算,比如取绝对值.abs(),开平分根.sqrt(),可以比较两个数组内对应两个元素中的最小值.min(.):
#include <Eigen/Dense>
#include <iostream>
using namespace Eigen;
using namespace std;
int main()
{
ArrayXf a = ArrayXf::Random();
a *= ;
cout << "a =" << endl
<< a << endl;
cout << "a.abs() =" << endl
<< a.abs() << endl;
cout << "a.abs().sqrt() =" << endl
<< a.abs().sqrt() << endl;
cout << "a.min(a.abs().sqrt()) =" << endl
<< a.min(a.abs().sqrt()) << endl;
}
//output
a =
1.36
-0.422
1.13
1.19
1.65
a.abs() =
1.36
0.422
1.13
1.19
1.65
a.abs().sqrt() =
1.17
0.65
1.06
1.09
1.28
a.min(a.abs().sqrt()) =
1.17
-0.422
1.06
1.09
1.28
6.数组和矩阵之间的转换
你不能在数组类中使用矩阵运算,或者在矩阵类中使用数组运算。因此,当你需要进行线性代数的运算时,使用矩阵类,当你需要对系数进行运算操作时,使用数组类。但是,有时候你既要用到数组类的运算操作,又得用矩阵类的运算操作。在这样的情况下,你可以在数组和矩阵之间进行相互转换。
对矩阵表达而言,可以使用.array()函数来将其转换成数组表达,这样你就可以对系数进行相关运算操作;对于数组表达而言,可以使用.matrix()函数来将其转换为矩阵表达,你也可以进行线性代数的运算了。
在eigen中混用矩阵表达和数组表达是不允许的。比如你不能将数组和矩阵加起来,但是可以转换成同一种表达之后相加。有一种例外情况就是赋值运算符,允许将矩阵表达赋值给数组变量,也允许将数组表达赋值给矩阵变量。
两个数组的乘法等于对于系数相乘,与矩阵函数.cwisseProduct(.)的功能相同:
#include <Eigen/Dense>
#include <iostream>
using namespace Eigen;
using namespace std;
int main()
{
MatrixXf m(,);
MatrixXf n(,);
MatrixXf result(,);
m << ,,
,;
n << ,,
,;
result = m * n;//矩阵乘法
cout << "-- Matrix m*n: --" << endl << result << endl << endl;
result = m.array() * n.array();//数组乘法,对应系数相乘
cout << "-- Array m*n: --" << endl << result << endl << endl;
result = m.cwiseProduct(n);//利用矩阵成员函数对两个矩阵对应系数相乘
cout << "-- With cwiseProduct: --" << endl << result << endl << endl;
result = m.array() + ;//数组加法,每个元素加4
cout << "-- Array m + 4: --" << endl << result << endl << endl;
}
//output
-- Matrix m*n: -- -- Array m*n: -- -- With cwiseProduct: -- -- Array m + : --
以下是更复杂的运算:
#include <Eigen/Dense>
#include <iostream>
using namespace Eigen;
using namespace std;
int main()
{
MatrixXf m(,);
MatrixXf n(,);
MatrixXf result(,);
m << ,,
,;
n << ,,
,;
result = (m.array() + ).matrix() * m;//m每个系数先加4再进行矩阵乘法运算
cout << "-- Combination 1: --" << endl << result << endl << endl;
result = (m.array() * n.array()).matrix() * m;//m和n的每个对应系数相乘,然后再进行矩阵计算
cout << "-- Combination 2: --" << endl << result << endl << endl;
}
1.3eigen中数组类和系数的运算的更多相关文章
- OC中数组类NSArray的详解,数组的遍历(二)
数组类的便利 1.for循环(大家都会的...) 2.NSEmunerator 3.for in 首先重点说下 第二种NSEmunerator枚举器,系统声明是 @interface NSEnumer ...
- OC中数组类NSArray的详解,常用属性和方法(一)
数组是一个有序的集合,OC中的数组只能存储对象类型, 但是对于对象的类型没有限制. 通过下标访问数组元素,下标从0开始. NSA
- python3.4中自定义数组类(即重写数组类)
'''自定义数组类,实现数组中数字之间的四则运算,内积运算,大小比较,数组元素访问修改及成员测试等功能''' class MyArray: '''保证输入值为数字元素(整型,浮点型,复数)''' de ...
- problem: vue之数组元素中的数组类型值数据改变却无法在子组件视图更新问题
问题:给父组件上的一个数组中的某个元素中的数组类型值,添加值后,数据没有在子组件上更新. 对元素添加值之后,vue的数据其实已经更新了并传给了子组件,子组件中没有立即更新. 那么这里有个问题,在子组件 ...
- C#中自定义类数组和结构数组的使用
如有雷同,不胜荣幸,若转载,请注明 C#中自定义类数组和结构数组的使用 最近在很多项目中发现很多时候给定的数组要实现某个逻辑或处理很是麻烦,一维数组,二维数组,,,等等需要经过n多转换,还不如自己写一 ...
- C++中若类中没有默认构造函数,如何使用对象数组
前言: 如果定义一个类,有其默认的构造函数,则使用new动态实例化一个对象数组,不是件难事,如下代码: #include <memory> #include <iostream> ...
- C++ 中数组做参数的分析
C++ 中数组做参数的分析 1.数组降价问题? "数组引用"以避免"数组降阶",数组降阶是个讨厌的事,这在C语言中是个无法解决的问题,先看一段代码,了解什么是& ...
- JavaScript中数组操作常用方法
JavaScript中数组操作常用方法 1.检测数组 1)检测对象是否为数组,使用instanceof 操作符 if(value instanceof Array) { //对数组执行某些操作 } 2 ...
- js中对象 类 实例的区别 数据类型 创建对象
类是对象的具体细分,实例是类中的一个具体事物. 基本数据类型和 引用数据类型 基本数据类型:numble string undefined null 引用数据类型:对象和函数 对象数据类型又细分为:对 ...
随机推荐
- Node安装及自定义config
下载Node.js , Windows下安装一键到底, 没有什么说的. 主要是默认无法流畅使用, 包括流畅下载, 全局缓存之类. 如下是进一步设置, 包括: - 设置淘宝镜像. - 增加Yarn(np ...
- C语言数据结构基础学习笔记——栈和队列
之前我们学过了普通的线性表,接下来我们来了解一下两种特殊的线性表——栈和队列. 栈是只允许在一端进行插入或删除的线性表. 栈的顺序存储结构也叫作顺序栈,对于栈顶指针top,当栈为空栈时,top=-1: ...
- http stream
http stream 博客分类: http://canofy.iteye.com/blog/2097876 j2EE StringBuilder sb = new StringBuilder() ...
- python中的__str__()函数
__str__()函数的作用: 不知道大家再写程序是,打印一个实例化对象时,打印的其实时一个对象的地址.而通过__str__()函数就可以帮助我们打印对象中具体的属性值,或者你想得到的东西. 因为再p ...
- 活用RPM获取包的信息
rpm -q 功效大 如果你想要在系统上安装.卸载或是升级软件,需要对系统软件进行查询:或是有如下的场景: 安装了一个软件,需要知道这个软件的版本. 遇到一个文件,不认识它,需要知道它是什么软件,有什 ...
- 与引导文件系统/vmfs/devices..的备用设备之间的连接已丢失,主机配置更改将不会保存到持久存储中
Cisco UCS 刀片服务器与NETAPP存储 1.异常问题描述: 2.可能原因:存储链路异常 比如断电恢复.光纤线本身的问题.模块的问题.环境温度的问题.bug之类的都有可能 3.处理: ...
- 可以作为瘟到死(windows)路径的字符
!#$%&""()+-0123456789;=@ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz[]^_`{}~
- jQuery之动画
动画相关方法: .hide()..show()..toggle() 参数:null 或 (duration, easing, callblack) .fadeIn..fadeout ..fadeTog ...
- 简单的TSQL基础编程格式,存储过程,视图
这里简单整理一下数据库简单的编程,变量定义,赋值,分支语句和循环(这里以Sqlserver),以及存储过程格式 首先是变量定义,赋值,分支语句 --======TSQL数据库基础编程,定义变量,赋值, ...
- 原生js实现Base64编码解码
注:ie10+ var str = window.btoa("liusong"); console.log(str); var s = window.atob("bGl1 ...