Eigen 3.3.7 数组类(Array)和元素操作

数组类(Array)和元素操作

原文地址:http://eigen.tuxfamily.org/dox/group__TutorialArrayClass.html

Array 类有什么用?

Array 类提供了一个一般用途的数组,用于操作元素相关算法,就像 Matrix 专门用于实现线性代数算法。更具体一点,Array 提供了对元素进行操作的方法,这些操作大部分与线性代数算法无关。比如数组中每个元素都加一个常量或者两个同维数组对应元素相乘。

Array 类型

Array 是一个模板类,和Matrix有着相同的模板参数,前三个模板参数如下:
Array<typename Scalar, int RowsAtCompileTime, int ColsAtCompileTime>

模板参数的功能与 Matrix 相同,这里就不在重复解释。

与 Matrix 相同,Eigen 也内置了一些常用的 Array 对象,不过与 Matrix 不同指出在于Array同时定义了一维和二维Array。内置 Array 类型的任意维度均不大于4:

Array<float,Dynamic,1> ArrayXf
Array<float,3,1> Array3f
Array<double,Dynamic,Dynamic> ArrayXXd
Array<double,3,3> Array33d 

Array 元素的引用

与 Matrix 相同,Array 重载了小括号以实现 Array 对象中元素的读写。同样,Array重载了 << 以实现 Array 的初始化或者打印(std::cout<<array;)。

更多有关初始化的话题请参考这里

加减运算

Array 的加减运算是 element-wise 的,也就是相同尺寸 Array 对应元素之间的加减。

Array 也提供了 Array 和标量之间的加减运算(这是与 Matrix 的不同之处):array+scalar,Array 每个元素都与 scalar 相加。

乘法运算

两个相同尺寸的 Array 对应元素之间的乘法。Matrix 中也有对应的方法:.cwiseProduct(.)

其他元素相关的运算

Array 提供了其他有用的元素相关的运算,例如,求元素绝对值的 abs()、求平方根的 sqrt()、求两个 Array 相同位置最小值的 min(.) 等,示例如下:

cout << a.abs() << endl;
cout << a.abs().sqrt() << endl;
cout << a.min(a.abs().sqrt()) << endl;

更多方法可参考:Quick reference guide

Matrix和Array之间的转换

Eigen 中 Matrix 和 Array 的职能不同,前者完成线性代数相关算法,后者完成元素相关的计算,你需要按照自己需求在二者之间进行选择。有些时候我们需要同时对数据进行线性代数相关的操作和元素相关的操作,这个时候就需要在 Matrix 和 Array 之间进行转换。

Matrix 有一个 array() 方法可将 Matrix 转化为 Array 对象。同样,Array 有一个 matrix() 方法可将 Array 对象转化为 Matrix 对象。和 Eigen 表达式优化一样,这种转换没有运行时消耗(假设你允许编译器优化)。.array() 方法和 .matrix() 方法的返回值均可以当做左值或者右值进行使用。

Eigen 不允许在同一个表达式中同时使用 Array 和 Matrix 对象,也就是说你不能直接将 Array 和 Matrix 对象相加。重载的运算符 +,其两侧要么全是 Array,要么全是 Matrix 对象。赋值运算符是个例外,你可以将 Matrix d对象赋予 Array 对象,同样你也可以将 Array 对象赋予 Matrix对象。

  MatrixXf m(2,2);
  MatrixXf n(2,2);
  MatrixXf result(2,2);
  m << 1,2,
       3,4;
  n << 5,6,
       7,8;
  result = m * n;
  result = m.array() * n.array();
  result = m.cwiseProduct(n);
  result = m.array() + 4;

其他例子,如:(m.array() + 4).matrix()*m(m.array() * n.array()).matrix() * m

原文地址:https://www.cnblogs.com/jiahu-Blog/p/11337261.html

时间: 2024-07-31 03:45:46

Eigen 3.3.7 数组类(Array)和元素操作的相关文章

封装动态数组类Array

功能: 1.增.删.改.查 2.扩容.缩容 3.复杂度分析 4.均摊复杂度 5.复杂度震荡 分析动态数组的时间复杂度: 分析resize的时间复杂度: public class Array<E> { private E[] data; private int size; // 构造函数,传入数组的容量capacity构造Array public Array(int capacity){ data = (E[])new Object[capacity]; size = 0; } // 无参数的构

Postgresql Jsonb字段内含数组属性的删除元素操作

1.创建示例表 create temp table settings as select '{"west": [ {"id": "aa92f346-7a93-4443-949b-4eab0badd983", "version": 1}, {"id": "cd92e346-6b04-3456-050a-5eeb0bddd027", "version": 3} ]}'::

实验11:Problem D: 分数类的模板数组类

在默认构造函数里面,分母的默认值不能为0!! Home Web Board ProblemSet Standing Status Statistics Problem D: 分数类的模板数组类 Problem D: 分数类的模板数组类 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 509  Solved: 350[Submit][Status][Web Board] Description 封装一个模板数组类Array,支持一下操作: 1. 构造函

实验6:Problem B: 数组类(II)

Description 封装一个模板数组类,用于存储数组和处理的相关功能,支持以下操作: 1. Array::Array(int l)构造方法:创建一个长度为l的组对象. 2. Array::size()方法:返回Array对象中元素个数. 3. Array::put(int n)方法:按从大到小的顺序输出前n大元素,若数组长度小于n则从大到小输出全部元素. 4. 下标运算符:返回下标所指的元素. -------------------------------------------------

Problem A: 数组类(II)

Description 封装一个模板数组类,用于存储数组和处理的相关功能,支持以下操作: 1. Array::Array(int l)构造方法:创建一个长度为l的组对象. 2. Array::size()方法:返回Array对象中元素个数. 3. Array::put(int n)方法:按从大到小的顺序输出前n大元素,若数组长度小于n则从大到小输出全部元素. 4. 下标运算符:返回下标所指的元素. -------------------------------------------------

C++实践参考——数组类运算的实现

[项目-数组类运算的实现] 设计数组类Array,为了实现测试函数中要求的功能,请补足相关的函数(构造.析构函数)和运算符重载的函数. 实现策略提示:可以将测试函数中的语句加上注释,取消一句的注释,增加相应的函数,以渐增地实现所有的功能,避免全盘考虑带来的困难. class Array { private: int* list; //用于存放动态分配的数组内存首地址 int size; //数组大小(元素个数) public: //成员函数声明 }; //要求测试函数能够运行出正确.合理的结果:

Problem A: 数组类(I)

Problem A: 数组类(I) Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 3295  Solved: 2418[Submit][Status][Web Board] Description 封装一个整型数组类,用于存储整数和处理的相关功能,支持以下操作: 1. Array::Array()无参构造方法:创建一个空数组对象. 2. Array::size()方法:返回Array对象中元素个数. 3. Array::get(int n)方法:按

Problem B: 数组类(II)

Problem B: 数组类(II) Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 3606  Solved: 1760[Submit][Status][Web Board] Description 封装一个模板数组类,用于存储数组和处理的相关功能,支持以下操作: 1. Array::Array(int l)构造方法:创建一个长度为l的组对象. 2. Array::size()方法:返回Array对象中元素个数. 3. Array::put(int

Problem S: 分数类的模板数组类

Problem S: 分数类的模板数组类 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 2155  Solved: 1624[Submit][Status][Web Board] Description 封装一个模板数组类Array,支持一下操作: 1. 构造函数Array(int n),将数组初始化为n个存储空间: 2. 函数input(int n),读取最多n个元素,但不能超过数组存储空间的上限: 3. 重载下标运算符,返回数组的元素. 封装一