转载于: https://www.cnblogs.com/houkai/p/6349970.html

Array类和元素级操作

为什么使用Array

相对于Matrix提供的线性代数运算,Array类提供了更为一般的数组功能。Array类为元素级的操作提供了有效途径,比如点加(每个元素加值)或两个数据相应元素的点乘。

Array

Array是个类模板(类似于Matrx),前三个参数是必须指定的,后三个是可选的,这点和Matrix是相同的。

Array<typename Scalar, int RowsAtCompileTime, int ColsAtCompileTime>

Eigen也提供的一些常用类定义,Array是同时支持一维和二维的(Matrix二维,Vector一维)。

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

获取元素

读写操作重载于matrix, << 可以用于初始化array或打印。

#include <Eigen/Dense>
#include <iostream>
using namespace Eigen;
using namespace std;
int main()
{ArrayXXf  m(2,2);// assign some values coefficient by coefficientm(0,0) = 1.0; m(0,1) = 2.0;m(1,0) = 3.0; m(1,1) = m(0,1) + m(1,0);// print values to standard outputcout << m << endl << endl;// using the comma-initializer is also allowedm << 1.0,2.0,3.0,4.0;// print values to standard outputcout << m << endl;
}

加法和减法

和matrix类似,要求array的尺寸一致。同时支持array+/-scalar的操作!

#include <Eigen/Dense>
#include <iostream>
using namespace Eigen;
using namespace std;
int main()
{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;// Adding two arrayscout << "a + b = " << endl << a + b << endl << endl;// Subtracting a scalar from an arraycout << "a - 2 = " << endl << a - 2 << endl;
}

输出

a + b = 2  4  65  7  98 10 12a - 2 =
-1  0  12  3  45  6  7

乘法

支持array*scalar(类似于matrix),但是当执行array*array时,执行的是相应元素的乘积,因此两个array必须具有相同的尺寸。

int main()
{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;
}a * b = 5 12
21 32

其他元素级操作

Function function
abs 绝对值
sqrt 平方根
min(.) 两个array相应元素的最小值
int main()
{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;
}

array和matrix之间的转换

当需要线性代数类操作时,请使用Matrix;但需要元素级操作时,需要使用Array。这样就需要提供两者的转化方法。

Matrix提供了.array()函数将它们转化为Array对象。

Array提供了.matrix()函数将它们转化为Matrix对象。

在Eigen,在表达式中混合Matrix和Array操作是被禁止的,但是可以将array表达式结果赋值为matrix。

另外,Matrix提供了cwiseProduct函数也实现了点乘。

#include <Eigen/Dense>
#include <iostream>
using namespace Eigen;
using namespace std;
int main()
{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;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;
}

输出

-- Matrix m*n: --
19 22
43 50-- Array m*n: --5 12
21 32-- With cwiseProduct: --5 12
21 32-- Array m + 4: --
5 6
7 8

类似, array1.matrix() * array2.matrix() 将执行矩阵乘法。

Eigen教程(4)之Array类和元素级操作相关推荐

  1. Eigen(5)Array类和元素级操作

    0. 为什么使用Array 相对于Matrix提供的线性代数运算,Array类提供了更为一般的数组功能.Array类为元素级的操作提供了有效途径,比如点加(每个元素加值)或两个数据相应元素的点乘. 1 ...

  2. Eigen官网教程(2) Array类和元素级操作

    0 引言 Array类提供了和Matrix不同的操作,Matrix主要为了线性代数而设计,而Array类是通常用的数组.Array类提供了更方便的元素级的操作,但是没有线性代数方面的意义,比如给每个元 ...

  3. Eigen教程(8)之Map类

    转载于: https://www.cnblogs.com/houkai/p/6349981.html 原生缓存的接口:Map类 这篇将解释Eigen如何与原生raw C/C++ 数组混合编程. 简介 ...

  4. Eigen教程:1 Eigen简介和矩阵常见操作

    文章目录 一. 模块和头文件 二. 矩阵 1. 矩阵类型 2. 数据存储 3. 动态矩阵和静态矩阵 4. 矩阵元素的访问 5. 设置矩阵的元素 6. 重置矩阵大小 7. 矩阵和向量的算术运算 8. 行 ...

  5. Eigen教程(1)之简介

    转载于: https://www.cnblogs.com/houkai/p/6347408.html Eigen是一个用于矩阵运算的跨平台C++库. 安装 下载eigen:https://gitlab ...

  6. Eigen教程1 - 基础

    Eigen教程1 - 基础 参考:https://blog.csdn.net/xuezhisdc/article/details/54619853 固定大小的矩阵和向量 /** 参考链接:http:/ ...

  7. Java Generics示例教程 - 通用方法,类,接口

    Java Generics示例教程 - 通用方法,类,接口 Java Genrics是Java 5中引入的最重要的功能之一.如果您一直在使用Java Collections 对于版本5或更高版本,我确 ...

  8. Eigen教程(10)之混淆

    转载于: https://www.cnblogs.com/houkai/p/6349990.html 混淆 在Eigen中,当变量同时出现在左值和右值,赋值操作可能会带来混淆问题.这一篇将解释什么是混 ...

  9. ruby array_在Ruby中使用Array.pop和Array.shift方法从Array中删除元素

    ruby array Ruby Array.pop和Array.shift方法 (Ruby Array.pop and Array.shift methods) If you are reading ...

最新文章

  1. shell脚本编程之使用结构化命令
  2. 云信小课堂|简单五步,轻松构建本土「Clubhouse」
  3. 常用软件滤波算法---摘自:FeoTech
  4. SpringSecurity + JWT,从入门到精通!
  5. php基于新浪ip库获取城市,PHP基于新浪IP库获取IP详细地址的方法
  6. Ansys节点数据批量一键导出脚本生成CSV (ansys数据导出利用matlab脚本)
  7. Java RandomAccessFile writeLong()方法与示例
  8. [BZOJ3781]小B的询问
  9. [导入]正则表达式学习心得体会(3)(转)
  10. 《ASCE1885的源码分析》の简单的进程封装类
  11. BIM模型文件下载——某体育馆项目Revit模型
  12. abb机器人伺服电机报闸是什么_什么是抱闸电机
  13. 中标麒麟Neokylin7桌面版安装指南——基于VirtualBox虚拟机
  14. DID会固定年份吗_你了解渐进式DID平行趋势图的几种画法吗?
  15. 国际商务谈判 简答题
  16. centos7安装bcc和简单测试
  17. 海外仓物流有哪些优缺点
  18. 弹性力学——一些知识
  19. matlab中subplot函数的功能
  20. android 广播的实现,安卓广播的底层实现原理

热门文章

  1. GridView控件RowDataBound事件中获取列字段的几种途径
  2. Java语言程序设计(一)简答题和论述题
  3. Zabbix触发器和监控项设置时间范围.
  4. Zabbix动态监控磁盘I/O
  5. 【Python-2.7】换行符和制表符
  6. 【Oracle】RMAN备份
  7. 【Linux】grep命令
  8. vscode-tab按键失效变为切换功能的解决方法
  9. 解决使用vue-awesome-swiper组件分页器pagination样式设置失效问题
  10. [解决方案]WebAPI+SwaggerUI部署服务器后,访问一直报错的问题