原始页面:http://eigen.tuxfamily.org/dox/group__TutorialArrayClass.html
Array 类提供了一个一般用途的数组,就像Matrix专门用于实现线性代数算法。更具体一点,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
与Matrix相同,Array重载了小括号以实现Array对象中元素的读写。同样,Array重载了 <<
以实现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。
Eigen中Matrix和Array的职能不同,前者完成线性代数相关计算,后者完成元素相关的计算,你需要按照自己需求在二者之间进行选择。然后有些时候我们需要同时对数据进行线性代数相关的操作和元素相关的操作,这个时候就需要在Matrix和Array之间进行转换。
Matrix有一个array()方法将Matrix转化为Array对象。同样,Array有一个matrix()方法将Array转化为Matrix对象。和Eigen表达式优化一样,这种转换没有运行时消耗(假设你运行编译器优化)。.array()方法和.matrix()方法的返回值均可以当做左值或者右值进行使用。
Eigen不允许在同一个表达式中同时使用array和matrix对象,也就是说你不能直接将Array和Matrix对象相加。重载的运算符 +
,其两侧要么全是Array,要么全是Matrix对象。赋值运算符是个例外,你可以将Matrix赋予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