Valarrays

news2024/12/23 6:03:00

C++标准库提供了一个class valarray用以进行数值数组的运算。

它声明于头文件<valarray>

namespace std{
    template<class T> class valarray; //numeric array of type T
    
    class slice;
    template<class T> class slice_array; //slice out of a valarray

    class gslice;
    template<class T> class gslice_array; //a generalized slice

    template<class T> calss mask_array; //a masked valarray

    template<class T> class indirect_array; //an indirected valarray
}
  • valarray是核心类别,管理一个数值数组
  • slice和gslice用来为valarray提供切割(slice)和子集(subset)操作
  • slice_array,gslice_array,mask_array,indirect_array是内部辅助类别,用来存放临时的数值或数据,你不能在应用程序中直接使用它们,它们由valarray的某些操作过程间接产生。

valarrays的构造 

构造valarray时,通常应该将元素的数量当作参数传入:

std::valarray<int> val(10);       //valarray of 10 ints with value 0
std::valarray<float> val(5.7,10);  //valarray of ten floats with value 5.7

如果你只传入一个参数,它将被视为valarray的大小,各元素则以其型别的缺省构造函数加以初始化。如果元素是基本型别,初值就是0。如果你传入第二个参数,那么第一个参数就是元素初值,第二个参数就是元素个数。注意这里的行为和C++标准程序库的其他class的习惯不同,所有STL容器都是把第一参数视为元素个数,第二参数视为元素初值。 

Valarray的各项操作

valarray可以通过下标操作符来存取某个元素,第一个元素的索引为0,此外还定义了所有的普通数值运算(加、减、乘、模数、反相、位操作、比较操作、逻辑操作、赋值操作),这些操作符会针对参与运算的每一个元素被调用起来,因此valarray的运算结果也是一个valarray,例如

va1 = va2 * va3;

等同于:

va1[0] = va2[0] * va3[0];
va1[1] = va2[1] * va3[1];
va1[2] = va2[2] * va3[2];
...

如果是二元操作符,操作数之一可以是元素型别的某个单值,这种情况下,该值将与另一个操作数(某个valarray)中的每一个元素组合运算,例如

va1 = 4 * va2;

等同于:

va1[0] = 4 * va2[0];
va1[1] = 4 * va2[1];
va1[2] = 4 * va2[2];
...

注意这个单值的型别必须和valarray的元素的型别完全一致,因此假如

std::valarray<double> va(20);
...
va=4 * va;// ERROR type mistach

这个程序语句就无法运行。 

下面这个示例展示valarray的简单用法: 

#include<iostream>
#include<valarray>
using namespace std;
template <class T>
void printValarray(const valarray<T>& va)
{
	for (int i = 0; i < va.size(); ++i)
	{
		cout << va[i] << " ";
	}
	cout << endl;
}

int main()
{
	//define two valrray with ten elements
	valarray<double> va1(10), va2(10);

	//assign values to the first valarray
	for (int i = 0; i < 10; ++i)
	{
		va1[i] = i * 1.1;
	}

	//assign all -1 to second valarray
	va2 = -1;

	printValarray(va1);
	printValarray(va2);

	//print minimum,maximum and sum of the first valarray
	cout << "min(): " << va1.min() << endl;
	cout << "max(): " << va1.max() << endl;
	cout << "sum(): " << va1.sum() << endl;

	//assign values of the first to the second valarray
	va2 = va1;

	//remove all elements of the first valarray
	va1.resize(0);

	printValarray(va1);
	printValarray(va2);
}

 超越函数

超越计算(三角运算和指数运算)的定义如同一般数值运算:运算目标是valarray中的所有元素,对于二元运算,操作数之一可以是隶属元素型别之下的某个单值——这种情况下此一单值将和另一操作数(某valarray)的每一个元素组合运算。

下面展示超越函数的用法:

#include<iostream>
#include<valarray>
using namespace std;

template<class T>
void printValarray(const valarray<T> & va)
{
	for (int i = 0; i < va.size(); ++i)
	{
		cout << va[i] << " ";
	}
	cout << endl;
}

int main()
{
	//create and initialize valarray with nine elements
	valarray<double> va(9);
	for (int i = 0; i < va.size(); ++i)
	{
		va[i] = i * 1.1;
	}

	//print valarray
	cout << "va: ";
	printValarray(va);

	//double values in the valarray
	va *= 2.0;

	//print valarray
	cout << "va: ";
	printValarray(va);

	//create second valarray initialized by the values of the first plus 10

	valarray<double> vb;
	vb = va + 10.0;

	//print valarray
	cout << "vb: ";
	printValarray(vb);

	//create thirs valarray as a result of processing both existing valarrays
	valarray<double>vc;
	vc = sqrt(va) + vb / 2.0 - 1.0;

	//print valarray
	cout << "vc: ";
	printValarray(vc);

}

valarray的子集

定义valarray子集的方法有四种:

  • slices(切割)
  • general slice(一般化切割)
  • Masked subsets(屏蔽式子集)
  • Indirect subsets(间接式子集)

Slices(切割)

一次切割动作(一个slice)定义出一个索引集,其具备三个属性

①起始索引②元素数量(size,大小)③元素间距(stride,步幅)

可以将这三个属性以上述次序作为参数,传给class slice的构造函数,例如以下表达式指定4个元素,从索引2开始,间距为3

slice(2,4,3)

其实也就是指定了2,5,8,11这四个索引所对应的元素

当然也可以设定间距为负数,但是必须保证这些索引都是合法的。

#include<iostream>
#include<valarray>
using namespace std;
template<class T>
void printValarray(const valarray<T> va, int num)
{
	for (int i = 0; i < va.size()/num; ++i)
	{
		for (int j = 0; j < num; ++j)
		{
			cout << va[i * num + j] << " ";
		}
		cout << endl;
	}
	cout << endl;
}
int main()
{
	valarray<double> va(12);
	//fill valarray with values
	for (int i = 0; i < 12; ++i)
	{
		va[i] = i;
	}
	printValarray(va, 3);


	va[slice(0, 4, 3)] = pow(valarray<double>(va[slice(1, 4, 3)]), valarray<double>(va[slice(2, 4, 3)]));
	printValarray(va, 3);

	//create valarray with three times the thrid element of va
	valarray<double> vb(va[slice(2, 4, 0)]);

	//multiply the thrid column by the elements of vb
	va[slice(2, 4, 3)] *= vb;
	printValarray(va, 3);

	//print the square root of the elements in the second row
	printValarray(sqrt(valarray<double>(va[slice(3, 3, 1)])), 3);

	//double the elements in the third row
	va[slice(2, 4, 3)] = valarray<double>(va[slice(2, 4, 3)]) * 2.0;
	printValarray(va, 3);
}

 

General Slices(一般化切割)

Gerenal slices 或称gslices,是slices的一般形式,与slices相似。大体上gslices跟slices有以下相同属性

①起始索引②元素数量(size,大小)③元素间距(stride,步幅)

和slices不同之处在于,gslices的元素数量和间距也是一个数组,其中的元素个数和其维度相同,假设有下列gslices:

start:2

size:[4]

stride:[3]

则这个gslices和一般的slices相同,然而如果gslices如下:

start:2

size:[2 4]

stride:[10 3]

那么这个gslices处理的是二维,所以这个gslices从索引2开始,以间距10取元素2次,以间距3取元素4次

2 5 8 11

12 15 18 21

下面是一个三维gslices

start:2

size:[3 2 4]

stride:[30 10 3]

从索引2开始,以间距30取3个值,以间距10取2个值,以间距3取4个值

2 5 8 11

12 15 18 21

32 35 38 41

42 45 48 51

62 65 68 71

72 75 78 81

能够运用数组来定义大小和间距,是gslices和slices之间的唯一区别。

全局性的数值函数

头文件<cmath>定义的函数
pow()求幂函数
exp()指数函数
sqrt()平方根
log()自然对数
log10()以10为底的对数
sin()正弦函数
cos()余弦函数
tan()正切函数
asin()反正弦函数
acos()反余弦函数
atan()反正切函数
atan2()商的反正切函数
ceil()大于某个浮点数的最小整数
floor()小于某个浮点数的最大整数
fabs()浮点数的绝对值
fmod()浮点数相除的余数
frexp()将一个浮点数转换成小数部分和整数部分
ldexp()将某个浮点数乘以2的某个整数次幂
modf()将浮点数分离为一个带正负号的整数和一个分数
头文件<cstdlib>定义的函数
abs()求某个int的绝对值
labs()求某个long的绝对值
div()求int相除的商和余数
ldiv()求long 相除的商和余数
srand()随机数产生器(种下新的随机数种子)
rand()随机数产生器(取得一个随机数)

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/500759.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java经典笔试题—day03

Java经典笔试题—day03 &#x1f50e;选择题&#x1f50e;编程题&#x1f95d;字符串中找出连续最长的数字串&#x1f95d;数组中出现次数超过一半的数字 &#x1f50e;结尾 &#x1f50e;选择题 (1)以下代码运行输出的是 public class Person{private String name "Pe…

怎么洗稿容易过稿-在线洗稿软件

自媒体洗稿软件 即使您是一位优秀的自媒体写作人员&#xff0c;也难免遇到让人头疼的撰写问题&#xff0c;例如无法处理大量原始文本、需要手动删除冗余信息、缺少时间针对每篇文章进行深入修改等问题。但是&#xff0c;现在有了我们的一款自媒体洗稿软件&#xff0c;您再也不需…

Android System crash DeadSystemException(Service/Activity/终极解决方案)

DeadSystemException&#xff1a; The core Android system has died and is going through a runtime restart. All running apps will be promptly killed. Android 核心系统服务已经死亡&#xff0c;正在重启中。全部正在运行的app即将被kill杀死。 更多请阅读&#xff0c;D…

Lecture 11:How versatile are self-supervised models

目录 Story 1: Cross-lingual Story 2: Cross-discipline Story 3: Pre-training with artificial data &#xff08;story1和story2的内容在前面课程中有讲过&#xff0c;这里笔记部分不再详述&#xff09; Story 1: Cross-lingual 多语言BERT具有跨语言的能力&#xff0…

Linux-Day01

Linux-Day01 课程内容 Linux简介Linux安装Linux常用命令 1. 前言 1.1 什么是Linux Linux是一套免费使用和自由传播的操作系统。说到操作系统&#xff0c;大家比较熟知的应该就是Windows和MacOS操作系统&#xff0c;我们今天所学习的Linux也是一款操作系统。 1.2 为什么要学…

12.IO流

1.字符流 1.1为什么会出现字符流【理解】 字符流的介绍 由于字节流操作中文不是特别的方便&#xff0c;所以Java就提供字符流 字符流 字节流 编码表 中文的字节存储方式 用字节流复制文本文件时&#xff0c;文本文件也会有中文&#xff0c;但是没有问题&#xff0c;原因是最…

消息队列中的事务消息

大家好&#xff0c;我是易安&#xff01;今天我们谈一谈消息队列中的事务消息这个话题。 一说起事务&#xff0c;你可能自然会联想到数据库。我们日常使用事务的场景&#xff0c;绝大部分都是在操作数据库的时候。像MySQL、Oracle这些主流的关系型数据库&#xff0c;也都提供了…

Java --- springboot2之异常处理

仅供参考 目录 一、异常处理 二、异常处理自动配置原理 三、异常处理流程 四、定制错误处理逻辑 4.1、自定义错误页 4.2、ControllerAdviceExceptionHandler处理全局异常 4.3、ResponseStatus自定义异常 4.4、Spring底层的异常&#xff0c;如 参数类型转换异常 4.5、自定义…

7种常见网络并发模型介绍

概述 对于网络服务器后端开发&#xff0c;为满足不同并发场景的需要&#xff0c;一般来说&#xff0c;不外乎几种常见的并发模型&#xff0c;除了一些教学场景常用的单线程、多进程&#xff08;线程&#xff09;的服务器实现外&#xff0c;生产用的服务器&#xff0c;一般都会…

Linux多路IO复用:epoll

1. epoll epoll是为克服select、poll每次监听都需要在用户、内核空间反复拷贝&#xff0c;以及需要用户程序自己遍历发现有变化的文件描述符的缺点的多路IO复用技术。 epoll原理 创建内核空间的红黑树&#xff1b; 将需要监听的文件描述符上树&#xff1b; 内核监听红黑树上…

实验室设备管理系统

访问【WRITE-BUG数字空间】_[内附完整源码和文档] 应用背景 为方便实验室进行设备管理&#xff0c;某大学拟开发实验室设备管理系统 来管理所有实验室里的各种设备。系统可实现管理员登录&#xff0c;查看现有的所有设备&#xff0c; 增加设备等功能。 开发环境 Mac OS PyCha…

JAVA:Springboot 装配数据库Hikari和Druid连接池

1、JDBC Java数据库连接&#xff08;Java Database Connectivity&#xff0c;简称JDBC&#xff09;是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口&#xff0c;提供了诸如查询和更新数据库中数据的方法。 JDBC API主要位于JDK中的java.sql包中&#xff08;之后…

出现小红书点赞多粉丝少的情况,原因在哪里

刚开始运营自己账号的小伙伴们有时发现明明笔记点赞数量不少&#xff0c;但偏偏账号粉丝数量就是一直不怎么涨&#xff0c;像这样小红书点赞多粉丝少是怎么回事呢?今天就来说说&#xff0c;小红书该如何吸引用户关注。 一、小红书点赞多粉丝少是怎么回事 一般来说&#xff0c;…

从MIMIC学习组织自己的数据

从MIMIC学习组织自己的数据 相对于SEER数据库&#xff08;我们得到的是几乎可以直接进行分析的数据&#xff09;&#xff0c;MIMIC 数据库在数据采集后虽然经过了一定的处理&#xff0c;但是保留了数据库原始的样貌&#xff0c;所以我们除了对MIMIC数据进行分析外&#xff0c;…

推荐算法之DeepFM

论文&#xff1a;DeepFM: A Factorization-Machine based Neural Network for CTR Prediction Github&#xff1a;https://github.com/ChenglongChen/tensorflow-DeepFM https://github.com/shenweichen/DeepCTR IJCAI2017 本文将深度神经网络dnn和因式分解机Factorization-M…

程序中各种异常报错,对于JVM调优记录

一&#xff1a;GC overhead limit exceeded 数据量过大&#xff1a;当应用程序处理大量的数据时&#xff0c;会占用大量的内存和计算资源。如果内存资源不足&#xff0c;则可能会在垃圾回收过程中出现 GC overhead limit exceeded 错误 程序代码有问题&#xff1a;如果 应用程…

Vmware虚拟机问题解决方案

Vmware虚拟机问题解决方案 1. 运行虚拟机系统蓝屏 可能的原因有两个: 1). 虚拟机所在磁盘的空间不足 ; -------> 清理磁盘空间 。 2). 操作系统版本高, 需要适配新版本的Vmware ; ------> 卸载Vmware15版本, 安装Vmware16版本 。 2. 卸载Vmware步骤 1). 卸载已经安…

商用密码产品认证中的随机数(一)

1 商密认证中的随机数介绍 如果说密钥的安全是密码产品的基石&#xff0c;那随机数的安全就是密钥安全的基石。密码产品设计和商用密码产品认证中&#xff0c;随机数的合规性也是需要重点关注的环节。 随机数的合规性主要包括&#xff1a; 随机数的来源合规。如果是自行设计的…

一点通路由模拟实验8

首先先设置hostA和hostB和hostC的ip 其次设置路由接口的各个ip 路由A 像这样的&#xff0c;再设置路由B 唯一要记住的是&#xff0c;时钟只要设置一个就行 就是clock rate 6400&#xff0c;之后开启路由&#xff1a;ip routing 然后就是查看路由表了&#xff08;路由A&#…

Lecture 12(Preparation):Reinforcement Learning

目录 What is RL? (Three steps in ML) Policy Gradient Actor-Critic Reward Shaping No Reward: Learning from Demonstration It is challenging to label data in some tasks. 例如下围棋时&#xff0c;下一步下在哪个位置最好是不太好确定的&#xff0c;此时可以考虑…