Eigen--Array

 2023-09-07 阅读 16 评论 0

摘要:Eigen 不仅提供了Matrix和Vector结构,还提供了Array结构。区别如下,Matrix和Vector就是线性代数中定义的矩阵和向量,所有的数学运算都和数学上一致。但是存在一个问题是数学上的定义并不一定能完全满足现实需求。比如,数学上并没有定义一个矩阵和

Eigen 不仅提供了Matrix和Vector结构,还提供了Array结构。区别如下,Matrix和Vector就是线性代数中定义的矩阵和向量,所有的数学运算都和数学上一致。但是存在一个问题是数学上的定义并不一定能完全满足现实需求。比如,数学上并没有定义一个矩阵和一个标量的加法运算。但是如果我们想给一个矩阵的每个元素都加上同一个数,那么这个操作就需要我们自己去实现,这显然并不方便。

Array 提供了一个Array类,为我们提供了大量的矩阵未定义的操作,且Array和Matrix之间很容易相互转换 ,所以相当于给矩阵提供更多的方法。也为使用者的不同需求提供了更多的选择。

下面看一下Array类的实现。Array类和Matrix有相同的参数。

Array<typename Scalar, int RowsAtCompileTime , int ColsAtCompileTime >

上面参数的意义和Matrix中参数的意义是相同的。

Array也对常用的情况作了一些类型定义

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

从上面的几种类型可以看出,Array和Matrix还是存在微小的差别。

访问 Array中元素

圆括号 ( ) 被重载用来访问Array中的元素。

举例如下:

#include <iostream>
#include <eigen3/Eigen/Dense>using namespace Eigen;
using namespace std;int main(int argc ,char** argv)
{ArrayXXf m(2,2);// 给元素单个赋值m(0,0) = 1.0;m(0,1) = 2.0;m(1,0) = 3.0;m(1,1) = m(0,1) + m(1,0);cout<<m<<endl<<endl;// 也可以使用逗号方式赋值m<<5.0,6.0,7.0,8.0;cout<<m<<endl;return 0;
}

运行结果如下:
在这里插入图片描述
加法和减法

对两个Array进行加法和减法是和Matrix一样,这个操作只要两个Array维度相同,元素类型相同就可以操作 。同时Array还定义了Matrix不支持的

对Array 和 一个标量进行的操作。举例如下:

#include <iostream>
#include <eigen3/Eigen/Dense>using namespace Eigen;
using namespace std;int main(int argc ,char** argv)
{ArrayXXf a(3,3);ArrayXXf b(3,3);a << 1,2,3,4,5,6,7,8,9;    b << 1,2,3,1,2,3,1,2,3;cout<<"a + b = "<<endl<<a+b<<endl<<endl;cout<<"a - 2 = "<<endl<<a-2<<endl;return 0;
}

运行结果如下:
在这里插入图片描述
乘法操作

对于一个Array和标量进行乘法操作是和Matrix一样的,同时Array也定义了两个Array之间的乘法操作,就是将两个Array的对于元素相乘。

举例如下:

using namespace Eigen;
using namespace std;int main(int argc ,char** argv)
{ArrayXXf a(2,2);ArrayXXf b(2,2);a << 1,2,3,4;b << 5,6,7,8;cout<<"a * b = "<<endl<<a*b<<endl<<endl;return 0;
}

运行结果如下:
在这里插入图片描述
可以看到执行了对于元素的乘法。

其它的元素操作

Array 还定义了 绝对值 abs() ,开平方根sqrt() , 以及找对应元素最小值操作 min() ;

举例如下:

#include <iostream>
#include <eigen3/Eigen/Dense>using namespace Eigen;
using namespace std;int main(int argc ,char** argv)
{ArrayXf a = ArrayXf::Random(5);a *= 2;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;return 0;
}

结果如下:
在这里插入图片描述
Array 和 Matrix 之间可以方便地进行转换

Array 有 .matrix( ) 方法。
Matrix 有 .array( )方法。

转载自:
博主:山里的小勇子
博文地址:https://www.cnblogs.com/wangxiaoyong/p/8904108.html
来源:博客园

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/4/13773.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息