C++矢量运算与java矢量运算

矢量运算

概述

矢量运算是一种基于向量的数学运算,它遵循特定的法则。以下是矢量运算的一些基本原理:

  • 矢量加法:可以使用平行四边形法则或三角形法则来执行。当两个矢量相加时,可以将它们的起点放在同一个点上,然后根据平行四边形法则,从这两个矢量的尾部画两条线,使其首尾相连,形成一个平行四边形。这个平行四边形的对角线即表示两矢量之和。如果使用三角形法则,则是将一个矢量的尾部与另一个矢量的头部相连,形成三角形,再从第一个矢量的起点到第二个矢量的尾部画一条线,这条线代表两矢量之和。
  • 矢量减法:被视作矢量加法的逆运算。从一个矢量中减去另一个矢量相当于加上那个矢量的负矢量。
  • 矢量与标量乘法:将矢量的每个分量乘以标量即可。几何意义上,一个矢量乘以正标量会使得矢量在保持方向不变的情况下扩大若干倍,而乘以负标量则会使矢量的方向反转并等比例缩小。
  • 矢量共线定理:表明如果两个矢量共线,那么其中一个矢量可以表示为另一个矢量与一个标量的乘积。

矢量运算比标量快的原因

  1. 并行性(Parallelism):矢量化操作可以同时对多个数据元素执行相同的操作。现代处理器中的矢量处理单元(如SSE、AVX指令集)可以在单个指令中对多个数据元素执行相同的操作,从而实现并行计算。相比之下,标量操作则需要逐个处理每个数据元素,无法充分利用处理器的并行计算能力。

  2. 数据局部性(Data Locality):矢量化操作可以提高数据的局部性,减少内存访问次数。由于矢量操作一次处理多个数据元素,可以更有效地利用处理器的缓存,降低了内存访问的开销。而标量操作需要对每个数据元素分别进行内存访问,导致更多的缓存未命中和内存带宽瓶颈。

  3. 指令优化(Instruction Optimization):矢量指令集(如SSE、AVX)提供了丰富的指令,能够对矢量数据进行高效的操作,包括加法、乘法、逻辑运算等。处理器可以利用这些指令进行更有效的优化,从而提高运算速度。相比之下,标量指令集的操作对象是单个数据元素,限制了处理器进行指令级并行优化的能力。

  4. 数据重用(Data Reuse):矢量化操作可以更好地利用数据重用的机会。在循环等迭代过程中,矢量化操作可以将多次计算相同的操作合并为一次计算,从而减少了重复计算的开销。而标量操作需要对每个数据元素分别进行计算,无法充分利用数据重用的机会。

C++矢量运算与标量运算的比较

#include <iostream>
#include <vector>
#include <chrono>int main() {std::vector<int> vec1 = {1, 2, 3};std::vector<int> vec2 = {4, 5, 6};std::vector<int> result(3);auto start = std::chrono::high_resolution_clock::now();for (size_t i = 0; i < vec1.size(); ++i) {result[i] = vec1[i] + vec2[i];}auto end = std::chrono::high_resolution_clock::now();std::chrono::duration<double> elapsed = end - start;std::cout << "Vector addition time: " << elapsed.count() << " seconds" << std::endl;int scalar1 = 1;int scalar2 = 4;start = std::chrono::high_resolution_clock::now();for (int i = 0; i < 3; ++i) {int scalar_result = scalar1 + scalar2;}end = std::chrono::high_resolution_clock::now();elapsed = end - start;std::cout << "Scalar addition time: " << elapsed.count() << " seconds" << std::endl;return 0;
}

运行结果:

java矢量运算与标量运算的比较

package org.cyl.spaceutils;import jdk.incubator.vector.FloatVector;
import jdk.incubator.vector.VectorSpecies;public class VectorScalarOperations {public static void main(String[] args) {// 定义矢量a和bfloat[] a = {1, 2, 3};float[] b = {4, 5, 6};float[] c=new float[a.length];VectorScalarOperations v1=new VectorScalarOperations();long startTime = System.nanoTime();v1.vectorComputation(a,b,c);long endTime = System.nanoTime();System.out.println("矢量花费的时间:"+(endTime-startTime));long startTime1 = System.nanoTime();v1.xadd(a,b,c);long endTime1 = System.nanoTime();System.out.println("标量花费的时间:"+(endTime1-startTime1));}static final VectorSpecies<Float> SPECIES = FloatVector.SPECIES_PREFERRED;void vectorComputation(float[] a, float[] b, float[] c) {int i = 0;int upperBound = SPECIES.loopBound(a.length);for (; i < upperBound; i += SPECIES.length()) {// FloatVector va, vb, vc;var va = FloatVector.fromArray(SPECIES, a, i);var vb = FloatVector.fromArray(SPECIES, b, i);var vc = va.mul(va).add(vb.mul(vb));vc.intoArray(c, i);}}void xadd(float[]a,float[]b,float[]c){for (int i=0;i<a.length;i++){c[i] = (a[i] * a[i] + b[i] * b[i]) * -1.0f;}}
}

java的要大量数据才能展现出其价值。

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

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

相关文章

RabbitMQ篇

1.初始MQ 1.1. 同步和异步通讯 微服务间通讯有同步和异步两种方式&#xff1a; 同步通讯&#xff1a;就像打电话&#xff0c;需要实时响应。 异步通讯&#xff1a;就像发邮件&#xff0c;不需要马上回复。 两种方式各有优劣&#xff0c;打电话可以立即得到响应&#xff0c;…

初阶数据结构:排序(学习笔记)

目录 1. 各种排序算法的分类2. 插入排序2.1 直接插入排序2.2 希尔排序 3. 选择排序3.1 选择排序3.2 堆排序4. 交换排序4.1 冒泡排序4.2 快速排序4.2.1 霍尔法&#xff08;hoare&#xff09;4.2.2 挖坑法&#xff08;hole&#xff09;4.4.3 前后指针法4.4.4 补充&#xff1a;非递…

存货计价方式 比较-移动平均和批次计价

SAP常用的存货计价方式有 标准价格移动平均价格批次计价 标准价格常用于制造企业&#xff0c;今天的方案比较主要集中在销售型企业常用的移动平均价和批次计价 批次计价&#xff1a; 移动平均&#xff1a; 两种计价方式的Pros&Cons 比较 批次计价 移动平均优点 1…

超好用的一键生成原创文案方法

在现代社会中&#xff0c;原创文案不管是在营销中&#xff0c;还是在品牌推广中都起着至关重要的作用。然而&#xff0c;对于许多人来说&#xff0c;创作出令人印象深刻且引人注目的原创文案并不容易。但随着技术的发展&#xff0c;我们现在可以利用一键生成原创文案的方法来帮…

黑马java-JavaSE进阶-java高级技术

1.单元测试 就是针对最小的功能单元方法&#xff0c;编写测试代码对其进行正确性测试 2.Junit单元测试框架 可以用来对方法进行测试&#xff0c;它是第三方公司开源出来的 优点&#xff1a; 可以灵活的编写测试代码&#xff0c;可以针对某个方法执行测试&#xff0c;也支持一键…

基于springboot的水果购物商城管理系统(程序+文档+数据库)

** &#x1f345;点赞收藏关注 → 私信领取本源代码、数据库&#x1f345; 本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目&#xff0c;希望你能有所收获&#xff0c;少走一些弯路。&#x1f345;关注我不迷路&#x1f345;** 一、研究背景…

Pinctrl子系统_04_Pinctrl子系统主要数据结构

引言 本节说明Pinctrl子系统中主要的数据结构&#xff0c;对这些数据结构有所了解&#xff0c;也就是对Pinctrl子系统有所了解了。 前面说过&#xff0c;要使用Pinctrl子系统&#xff0c;就需要去配置设备树。 以内核面向对象的思想&#xff0c;设备树可以分为两部分&#x…

rabbitmq3

指定通过通道将消息发送给哪个消息队列 同一个通道可以向不同的队列发送消息的&#xff0c;如果你绑定的队列和发布消息的队列不一致也是可以的&#xff0c;这个才是真正的发布消息去具体的某一个队列&#xff1a; 如果队列没有持久化&#xff0c;就不会把这个消息队列保存在磁…

stm32学习记录-5.2PWM输出控制sg90舵机角度

源码连接&#xff1a;https://gitee.com/HL12334/stm32-learning-code 前提知识&#xff1a; 1.定时器中断 1.关键概念 1.1pwm输出 1.常用术语 OC&#xff08;output compare&#xff09;输出比较CNT&#xff08;counter&#xff09;&#xff0c;定时器中用于计数的寄存器…

时序报告Report_timing_summary之一步精通配置选项使用

目录 一、前言 二、配置选项概览图 三、配置选项 3.1 Options 3.1.1 report 3.1.2 path limits 3.1.3 path display 3.2 Advanced 3.2.1 report 3.2.3 miscellaneous 3.3 Timer Settings 3.4 共有部分 四、工程示例 4.1 工程设计代码 4.2 约束文件 4.3 Option…

Linux系统架构----nginx的访问控制

nginx的访问控制 一、nginx基于授权的访问控制概述 Nginx与Apache一样&#xff0c;可以实现基于用户权限的访问控制&#xff0c;当客户端想要访问相应的网站或者目录时&#xff0c;要求用户输入用户名和密码&#xff0c;才能正常访问配置步骤生成用户密码认证文件 &#xff1…

qt带后缀单位的QLineEdit

QLineEditUnit.h #pragma once #include <QLineEdit> #include <QPushButton>class QLineEditUnit : public QLineEdit {Q_OBJECT public:QLineEditUnit(QWidget* parent Q_NULLPTR);~QLineEditUnit();//获取编辑框单位QString UnitText()const;//设置编辑框单位…

STM32的启动流程分析 和 一些底层控制的原理

阅读引言&#xff1a; 阅读本文之后&#xff0c; 你将对单片机&#xff0c; 甚至是嵌入式系统&#xff0c; 或者是传统的PC机系统的启动流程有一个大致的了解&#xff0c; 本文更加偏向于单片机的启动流程分析。 目录 一、基础知识 1.STM32系列的微控制器&#xff08;mcu&…

自研cloud框架专题–web模块(三)

项目特点一:框架集成 1.引入核心依赖2.配置相关功能 二:功能介绍 1.swagger支持并提供swagger快速配置2.knife增强swagger支持3.全局请求参数校验(Validation)支持4.字段脱敏支持5.默认jackson序列化6.xss,cors支持7.访问日志支持8.全局异常处理,统一返回结果9.系统关键及常用信…

数据结构之deque双端队列

一、概念&#xff1a; 众所周知&#xff0c;数据结构是用来存储数据&#xff0c;deque也不例外&#xff0c;他是集结了队列和栈的性质而成的结构&#xff0c;他几乎拥有所有数据结构能有的操作&#xff0c;看似已经大杀四方&#xff0c;可实际情况如何呢&#xff0c;那就带者这…

Day 8.TCP包头和HTTP

TCP包头 1.序号&#xff1a;发送端发送数据包的编号 2.确认号&#xff1a;已经确认接收到的数据的编号&#xff08;只有当ACK为1时、确认号才有用&#xff09;&#xff1b; TCP为什么安全可靠 1.在通信前建立三次握手 SYP SYPACK ACK 2.在通信过程中通过序列号和确认号和…

前端javascript的DOM对象操作技巧,全场景解析

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属的专栏&#xff1a;前端泛海 景天的主页&#xff1a;景天科技苑 文章目录 1.js的DOM介绍2.节点元素层级关系3.通过js修改&#xff0c;清空节点…

【棘手问题】Spring JPA一级缓存导致获取不到数据库表中的最新数据,对象地址不发生改变

【棘手问题】Spring JPA一级缓存导致获取不到数据库表中的最新数据&#xff0c;对象地址不发生改变 一、问题背景二、解决步骤2.1 debug2.2 原因分析2.2.1 数据步骤2.2.2 大模型解释2.2.3 解释举例2.2.4 关键函数 2.3 解决方案 三、Spring JPA一级缓存 一、问题背景 项目的数据…

STM32 通过Modbus协议更改内部Flash(模仿EEPROM)的运行参数

main.c测试 uint8_t uart1RxBuf[64]{0};uint8_t Adc1ConvEnd0; uint8_t Adc2ConvEnd0;int main(void) {/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initial…

C++ 智能指针深度剖析

文章目录 1. 前言2. 为什么需要智能指针&#xff1f;3. 内存泄漏3.1 内存泄漏的概念及危害3.2 内存泄漏的分类3.3 如何检测内存泄漏3.4 如何避免内存泄漏 4. 智能指针的使用及原理4.1 RAII思想4.2 智能指针的原理4.3 C智能指针发展历史4.4 std::auto_ptr4.5 std::unique_ptr4.6…