Eigen教程(4)之Array类和元素级操作
转载于: 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类和元素级操作相关推荐
- Eigen(5)Array类和元素级操作
0. 为什么使用Array 相对于Matrix提供的线性代数运算,Array类提供了更为一般的数组功能.Array类为元素级的操作提供了有效途径,比如点加(每个元素加值)或两个数据相应元素的点乘. 1 ...
- Eigen官网教程(2) Array类和元素级操作
0 引言 Array类提供了和Matrix不同的操作,Matrix主要为了线性代数而设计,而Array类是通常用的数组.Array类提供了更方便的元素级的操作,但是没有线性代数方面的意义,比如给每个元 ...
- Eigen教程(8)之Map类
转载于: https://www.cnblogs.com/houkai/p/6349981.html 原生缓存的接口:Map类 这篇将解释Eigen如何与原生raw C/C++ 数组混合编程. 简介 ...
- Eigen教程:1 Eigen简介和矩阵常见操作
文章目录 一. 模块和头文件 二. 矩阵 1. 矩阵类型 2. 数据存储 3. 动态矩阵和静态矩阵 4. 矩阵元素的访问 5. 设置矩阵的元素 6. 重置矩阵大小 7. 矩阵和向量的算术运算 8. 行 ...
- Eigen教程(1)之简介
转载于: https://www.cnblogs.com/houkai/p/6347408.html Eigen是一个用于矩阵运算的跨平台C++库. 安装 下载eigen:https://gitlab ...
- Eigen教程1 - 基础
Eigen教程1 - 基础 参考:https://blog.csdn.net/xuezhisdc/article/details/54619853 固定大小的矩阵和向量 /** 参考链接:http:/ ...
- Java Generics示例教程 - 通用方法,类,接口
Java Generics示例教程 - 通用方法,类,接口 Java Genrics是Java 5中引入的最重要的功能之一.如果您一直在使用Java Collections 对于版本5或更高版本,我确 ...
- Eigen教程(10)之混淆
转载于: https://www.cnblogs.com/houkai/p/6349990.html 混淆 在Eigen中,当变量同时出现在左值和右值,赋值操作可能会带来混淆问题.这一篇将解释什么是混 ...
- 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 ...
最新文章
- shell脚本编程之使用结构化命令
- 云信小课堂|简单五步,轻松构建本土「Clubhouse」
- 常用软件滤波算法---摘自:FeoTech
- SpringSecurity + JWT,从入门到精通!
- php基于新浪ip库获取城市,PHP基于新浪IP库获取IP详细地址的方法
- Ansys节点数据批量一键导出脚本生成CSV (ansys数据导出利用matlab脚本)
- Java RandomAccessFile writeLong()方法与示例
- [BZOJ3781]小B的询问
- [导入]正则表达式学习心得体会(3)(转)
- 《ASCE1885的源码分析》の简单的进程封装类
- BIM模型文件下载——某体育馆项目Revit模型
- abb机器人伺服电机报闸是什么_什么是抱闸电机
- 中标麒麟Neokylin7桌面版安装指南——基于VirtualBox虚拟机
- DID会固定年份吗_你了解渐进式DID平行趋势图的几种画法吗?
- 国际商务谈判 简答题
- centos7安装bcc和简单测试
- 海外仓物流有哪些优缺点
- 弹性力学——一些知识
- matlab中subplot函数的功能
- android 广播的实现,安卓广播的底层实现原理