1.3数组类和系数的运算

与矩阵类只适用与线性代数运算相反,数组类提供通用的数组类,能不利用线性代数的知识来对系数进行操作,比如对每个系数加上一个常数,或者乘上两个数组的系数。

1.数组类型

跟矩阵类一样,数组也是一个具有相同模板参数的类模板。和矩阵类相同,前三个模板参数是必须提供实参的:

  1. Array<typename Scalar, int RowsAtCompileTime, int ColsAtCompileTime>

后三个模板参数是选择性的。

对某些相同的情况,eigen同样也提供类型别名,但是与矩阵类有点不同的是,数组类用于一维和二维数组。依据惯例,ArrayNt表示一维数组,N表示数

组大小,t表示元素类型。对二维数组来讲,使用ArrayNNt来表示,如下所示:

  1. Array<float,Dynamic,> ArrayXf //动态绑定的一维数组,元素类型为单精度浮点型
  2. Array<float,,> Array3f //数组大小为3的一维数组,元素类型为单精度浮点型
  3. Array<double,Dynamic,Dynamic> ArrayXXd//动态绑定的二维数组 ,元素类型为双精度浮点型
  4. Array<double,,> Array33d //数组大小分别为3的二维数组,元素类型为双精度浮点型

2.访问数组元素

与矩阵一样,重载的括号运算符提供数组元素读写操作。同时<<输出运算符也能初始化数组或者打印它们。

  1. #include <Eigen/Dense>
  2. #include <iostream>
  3. using namespace Eigen;
  4. using namespace std;
  5. int main()
  6. {
  7. ArrayXXf m(,);
  8. // assign some values coefficient by coefficient
  9. m(,) = 1.0; m(,) = 2.0;
  10. m(,) = 3.0; m(,) = m(,) + m(,);
  11. // print values to standard output
  12. cout << m << endl << endl;
  13. // using the comma-initializer is also allowed
  14. m << 1.0,2.0,
  15. 3.0,4.0;
  16. // print values to standard output
  17. cout << m << endl;
  18. }
  19. //output

3.加减法

跟矩阵加减法一样,数组加减法只对两个数组有相同的大小有效。但是,数组能完成数组与标量的加法,这相当于数组内的所有元素都加上这个数值,这个提供了矩阵对象不能直接使用的功能。

  1. #include <Eigen/Dense>
  2. #include <iostream>
  3. using namespace Eigen;
  4. using namespace std;
  5. int main()
  6. {
  7. ArrayXXf a(,);
  8. ArrayXXf b(,);
  9. a << ,,,
  10. ,,,
  11. ,,;
  12. b << ,,,
  13. ,,,
  14. ,,;
  15. // Adding two arrays两个数组相加
  16. cout << "a + b = " << endl << a + b << endl << endl;
  17. // Subtracting a scalar from an array一个数组减去一个数
  18. cout << "a - 2 = " << endl << a - << endl;
  19. }
  20. //output
  21. a + b =
  22.  
  23. a - =
  24. -

4.数组乘法

数组可以和数值相乘,也可以和数组相乘。但是两个数组相乘与矩阵乘法不一样,数组相乘是对应的系数相乘:

  1. #include <Eigen/Dense>
  2. #include <iostream>
  3. using namespace Eigen;
  4. using namespace std;
  5. int main()
  6. {
  7. ArrayXXf a(,);
  8. ArrayXXf b(,);
  9. a << ,,
  10. ,;
  11. b << ,,
  12. ,;
  13. cout << "a * b = " << endl << a * b << endl;
  14. }
  15. //output
  16. a * b =

5.系数的其他运算

数组类还提供了除了上面加减法、乘法三种运算外的其他运算,比如取绝对值.abs(),开平分根.sqrt(),可以比较两个数组内对应两个元素中的最小值.min(.):

  1. #include <Eigen/Dense>
  2. #include <iostream>
  3. using namespace Eigen;
  4. using namespace std;
  5. int main()
  6. {
  7. ArrayXf a = ArrayXf::Random();
  8. a *= ;
  9. cout << "a =" << endl
  10. << a << endl;
  11. cout << "a.abs() =" << endl
  12. << a.abs() << endl;
  13. cout << "a.abs().sqrt() =" << endl
  14. << a.abs().sqrt() << endl;
  15. cout << "a.min(a.abs().sqrt()) =" << endl
  16. << a.min(a.abs().sqrt()) << endl;
  17. }
  18. //output
  19. a =
  20. 1.36
  21. -0.422
  22. 1.13
  23. 1.19
  24. 1.65
  25. a.abs() =
  26. 1.36
  27. 0.422
  28. 1.13
  29. 1.19
  30. 1.65
  31. a.abs().sqrt() =
  32. 1.17
  33. 0.65
  34. 1.06
  35. 1.09
  36. 1.28
  37. a.min(a.abs().sqrt()) =
  38. 1.17
  39. -0.422
  40. 1.06
  41. 1.09
  42. 1.28

6.数组和矩阵之间的转换

你不能在数组类中使用矩阵运算,或者在矩阵类中使用数组运算。因此,当你需要进行线性代数的运算时,使用矩阵类,当你需要对系数进行运算操作时,使用数组类。但是,有时候你既要用到数组类的运算操作,又得用矩阵类的运算操作。在这样的情况下,你可以在数组和矩阵之间进行相互转换。

对矩阵表达而言,可以使用.array()函数来将其转换成数组表达,这样你就可以对系数进行相关运算操作;对于数组表达而言,可以使用.matrix()函数来将其转换为矩阵表达,你也可以进行线性代数的运算了。

在eigen中混用矩阵表达和数组表达是不允许的。比如你不能将数组和矩阵加起来,但是可以转换成同一种表达之后相加。有一种例外情况就是赋值运算符,允许将矩阵表达赋值给数组变量,也允许将数组表达赋值给矩阵变量。

两个数组的乘法等于对于系数相乘,与矩阵函数.cwisseProduct(.)的功能相同:

  1. #include <Eigen/Dense>
  2. #include <iostream>
  3. using namespace Eigen;
  4. using namespace std;
  5. int main()
  6. {
  7. MatrixXf m(,);
  8. MatrixXf n(,);
  9. MatrixXf result(,);
  10. m << ,,
  11. ,;
  12. n << ,,
  13. ,;
  14. result = m * n;//矩阵乘法
  15. cout << "-- Matrix m*n: --" << endl << result << endl << endl;
  16. result = m.array() * n.array();//数组乘法,对应系数相乘
  17. cout << "-- Array m*n: --" << endl << result << endl << endl;
  18. result = m.cwiseProduct(n);//利用矩阵成员函数对两个矩阵对应系数相乘
  19. cout << "-- With cwiseProduct: --" << endl << result << endl << endl;
  20. result = m.array() + ;//数组加法,每个元素加4
  21. cout << "-- Array m + 4: --" << endl << result << endl << endl;
  22. }
  23. //output
  24. -- Matrix m*n: --
  25.  
  26. -- Array m*n: --
  27.  
  28. -- With cwiseProduct: --
  29.  
  30. -- Array m + : --

以下是更复杂的运算:

  1. #include <Eigen/Dense>
  2. #include <iostream>
  3. using namespace Eigen;
  4. using namespace std;
  5. int main()
  6. {
  7. MatrixXf m(,);
  8. MatrixXf n(,);
  9. MatrixXf result(,);
  10. m << ,,
  11. ,;
  12. n << ,,
  13. ,;
  14. result = (m.array() + ).matrix() * m;//m每个系数先加4再进行矩阵乘法运算
  15. cout << "-- Combination 1: --" << endl << result << endl << endl;
  16. result = (m.array() * n.array()).matrix() * m;//m和n的每个对应系数相乘,然后再进行矩阵计算
  17. cout << "-- Combination 2: --" << endl << result << endl << endl;
  18. }

1.3eigen中数组类和系数的运算的更多相关文章

  1. OC中数组类NSArray的详解,数组的遍历(二)

    数组类的便利 1.for循环(大家都会的...) 2.NSEmunerator 3.for in 首先重点说下 第二种NSEmunerator枚举器,系统声明是 @interface NSEnumer ...

  2. OC中数组类NSArray的详解,常用属性和方法(一)

    数组是一个有序的集合,OC中的数组只能存储对象类型, 但是对于对象的类型没有限制. 通过下标访问数组元素,下标从0开始. NSA

  3. python3.4中自定义数组类(即重写数组类)

    '''自定义数组类,实现数组中数字之间的四则运算,内积运算,大小比较,数组元素访问修改及成员测试等功能''' class MyArray: '''保证输入值为数字元素(整型,浮点型,复数)''' de ...

  4. problem: vue之数组元素中的数组类型值数据改变却无法在子组件视图更新问题

    问题:给父组件上的一个数组中的某个元素中的数组类型值,添加值后,数据没有在子组件上更新. 对元素添加值之后,vue的数据其实已经更新了并传给了子组件,子组件中没有立即更新. 那么这里有个问题,在子组件 ...

  5. C#中自定义类数组和结构数组的使用

    如有雷同,不胜荣幸,若转载,请注明 C#中自定义类数组和结构数组的使用 最近在很多项目中发现很多时候给定的数组要实现某个逻辑或处理很是麻烦,一维数组,二维数组,,,等等需要经过n多转换,还不如自己写一 ...

  6. C++中若类中没有默认构造函数,如何使用对象数组

    前言: 如果定义一个类,有其默认的构造函数,则使用new动态实例化一个对象数组,不是件难事,如下代码: #include <memory> #include <iostream> ...

  7. C++ 中数组做参数的分析

    C++ 中数组做参数的分析 1.数组降价问题? "数组引用"以避免"数组降阶",数组降阶是个讨厌的事,这在C语言中是个无法解决的问题,先看一段代码,了解什么是& ...

  8. JavaScript中数组操作常用方法

    JavaScript中数组操作常用方法 1.检测数组 1)检测对象是否为数组,使用instanceof 操作符 if(value instanceof Array) { //对数组执行某些操作 } 2 ...

  9. js中对象 类 实例的区别 数据类型 创建对象

    类是对象的具体细分,实例是类中的一个具体事物. 基本数据类型和 引用数据类型 基本数据类型:numble string undefined null 引用数据类型:对象和函数 对象数据类型又细分为:对 ...

随机推荐

  1. Linux中加速访问github

    1. 登录http://tool.chinaz.com/dns/ 2. 查询以下域名映射,并分别取访问速度较快的一个ip github.global.ssl.fastly.net   ->    ...

  2. Group Pathfinding & Movement in RTS Style Games

    转自:http://gamasutra.com/blogs/AndrewErridge/20180522/318413/Group_Pathfinding__Movement_in_RTS_Style ...

  3. 20165205 2017-2018-2 《Java程序设计》课程总结

    20165205 2017-2018-2<Java程序设计>课程总结 每周作业链接总结 预备作业一: 简述了我认为好的师生关系,展望了未来学习java的日子 预备作业二:总结了C语言的学习 ...

  4. 代码: !AJAX

    http://www.cnblogs.com/cwp-bg/p/7668840.html ajax和jsonp使用总结 2017-10-17 var requestUrl="http://l ...

  5. 机器学习算法中的准确率(Precision)、召回率(Recall)、F值(F-Measure)

    摘要: 数据挖掘.机器学习和推荐系统中的评测指标—准确率(Precision).召回率(Recall).F值(F-Measure)简介. 引言: 在机器学习.数据挖掘.推荐系统完成建模之后,需要对模型 ...

  6. [python]Generators

    generators(生成器)是python提供的一种机制,可以让函数一边循环一边计算,通常函数是一遍执行,而生成器可以在执行中间交出变量,下次调用时从交出变量的地方重新开始,这种机制通过yield关 ...

  7. Azkaban安装及分布式部署(multiple-executor)

    参考文章:https://blog.csdn.net/weixin_35852328/article/details/79327996 官网:https://azkaban.readthedocs.i ...

  8. mybatis的Selective接口和普通接口的区别

    举例说明: updateByPrimaryKeySelective会对字段进行判断再更新(如果为Null就忽略更新),如果你只想更新某一字段,可以用这个方法. updateByPrimaryKey对你 ...

  9. js 生成手机图片并保存到相册

    1.注意权限问题 2.调用HTML5+api 3.优化显示 4.注意兼容ios.Android

  10. String、StringBuffer、StringBuilder区别

    String.StringBuffer.StringBuilder区别 StringBuffer.StringBuilder和String一样,也用来代表字符串.String类是不可变类,任何对Str ...