从0开始学习NEON(2)

1、前言

继上一个例子,本次继续来学习NEON,本次学习NEON中向量拼接的操作,主要应用在图像的padding中。
https://blog.csdn.net/weixin_42108183/article/details/136440707

2、案例
2.1 案例1

在某些情况下,需要取在每个向量中去一部分值出来组成一个新的向量,这些值在逻辑上是连续的,如下图所示:
在这里插入图片描述

#include <stdio.h>
#include <stdlib.h>
#include <arm_neon.h>
#include <iostream>
#include <vector>
using namespace std;
#include <arm_neon.h>int main(){// a拼接b 再取偏移量float _a[] = {1,2,3,4}, _b[] = {5,6,7,8} ;float32x4_t a = vld1q_f32(_a);float32x4_t b = vld1q_f32(_b);float32x4_t r1 = vextq_f32(a,b,1); //r1={2,3,4,5}vector<float> show_data(4);vst1q_f32 (show_data.data(),r1);  for(auto n : show_data){cout <<  static_cast<int>(n) << endl;}   cout << "----------" << endl;float32x4_t r2 = vextq_f32(a,b,2); //r2={3,4,5,6}vst1q_f32 (show_data.data(),r2);  for(auto n : show_data){cout <<  static_cast<int>(n) << endl;}   cout << "----------" << endl;float32x4_t r3 = vextq_f32(a,b,3); //r3={4,5,6,7}vst1q_f32 (show_data.data(),r3);  for(auto n : show_data){cout <<  static_cast<int>(n) << endl;}   // float32x4_t r4 = vextq_f32(a,b,4); // 错误 对vextq_f32偏移量的范围有限制,最多偏移一个q寄存器范围的值return 0;
}
2.2、案例2

​ 在padding时,如果使用传统的方法,直接在原数据的周围加一圈数据,再将新数据储存起来,再进行其他操作。如果在一行一行padding的同时进行其他操作,就可以不用申请额外的空间了。

  • 常量填充

    常量填充是指,实现定义一个固定的padding向量,每一行的数据,都利用这个padding向量来计算边界值,如下图时针对左边界的填充

在这里插入图片描述

#include <stdio.h>
#include <stdlib.h>
#include <arm_neon.h>
#include <iostream>
#include <vector>
using namespace std;
#include <arm_neon.h>int main(){uint8_t pad_val = 0;//dup指令生成padding向量uint8x16_t v8_const_pad = vdupq_n_u8(pad_val);// 第0行数据vector<uint8_t> row0;for(int i=0;i<16;i++){row0.push_back(i);}auto v8_pre_row_data = v8_const_pad;  // 填充数据//读取第0行数据uint8x16_t v8_tmp_data = vld1q_u8(row0.data());//第0行带有左padding的数据uint8x16_t v8_row_cur_data = vextq_u8(v8_const_pad, v8_tmp_data, 15);  // 拼接起来从第15个偏移量的位置取数值// //读取第1行数据,假设第一行数据与第二行数据相等vector<uint8_t> row1 = row0v8_tmp_data = vld1q_u8(row1.data());// //第1行带有左padding的数据uint8x16_t v8_next_row_data = vextq_u8(v8_const_pad, v8_tmp_data, 15); return 0;
}
  • 复制填充

    复制填充就是将填充值修改为图像最边界的值,基本上和常量填充一致。

  • 反射填充

    反射填充的解释就在复制填充的情况下,将paddding向量逆序,例如有一个向量为 abcdefgh ,对于普通反射,直接取值然后逆序即可abcdefgh -> cdba|abcdefgh| hgfe,而对于101反射,则需要再变化一点 ,abcdefgh -> ecdb|abcdefgh| gfed。普通反射和101反射的区别是对称中心两个a的中间还是a本身。代码如下:

    #include <stdio.h>
    #include <stdlib.h>
    #include <arm_neon.h>
    #include <iostream>
    #include <vector>
    using namespace std;#include <arm_neon.h>int main(){vector<uint8_t> row0;for(int i=0;i<16;i++){row0.push_back(i);}// 取第1~7uint8x8_t v8_ref_pad0 = vld1_u8(row0.data()+1);  // 1,2,3,4,5,6,7,0// 逆序uint8x8_t v8_ref_pad1 = vrev64_u8(v8_ref_pad0);  // 0,7,6,5,4,3,2,1// 第0行原始数据uint8x16_t v8_row0_data = vld1q_u8(row0.data());   // 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15// 拼接,必须与第0行原始数据一样的长度才能调用vextq_u8这个函数uint8x16_t vcombine_0_1 = vcombine_u8(v8_ref_pad0, v8_ref_pad1);  // 1,2,3,4,5,6,7,0,0,7,6,5,4,3,2,1// 得到拼接后的向量uint8x16_t v8_cur_row_data = vextq_u8(vcombine_0_1, v8_row0_data, 15);  //  	           1,2,3,4,5,6,7,0,0,7,6,5,4,3,2,|1,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14|,15return 0;
    }
3、总结

本文主要学习了NEON中向量拼接并取值的操作,并在图像padding的应用中,有所体现。

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

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

相关文章

小程序环形进度条爬坑

在做微信小程序的时候&#xff0c;发现用canvas做的环形进度条&#xff0c;在带滚动条的view里面显示有闪动、显示不全的问题&#xff0c;后面改成echart-weixin的pie图实现了&#xff0c;option配置如下 // 表示进度的百分比 var progressValue 70;option {series: [{type: …

双非二本实习前的准备day8

学习目标&#xff1a; 每天2-3到简单sql&#xff08;刷完即止&#xff09;&#xff0c;每天复习代码随想录上的题目2-3道算法&#xff08;时间充足可以继续&#xff09;&#xff0c;背诵的八股的问题也在这里记录了 今日碎碎念&#xff1a; 1&#xff09;今天任务&#xff1…

指数幂+力扣

题目 题目链接 . - 力扣&#xff08;LeetCode&#xff09; 题目描述 代码实现 class Solution { public:double myPow(double x, int n) {long t n;return t > 0 ? _myPow(x, t) : 1 / _myPow(x, -t);}double _myPow(double x, int n){if(n 0) return 1;double y _…

docker安装与配置-网络方式ftp方式

说明&#xff1a; 本文环境&#xff1a;CentOS 7 1、#ip地址配置(在xnode2的基础上) [rootxnode2 ~]# cat /etc/sysconfig/network-scripts/ifcfg-eno16777736TYPEEthernetBOOTPROTOstaticDEFROUTEyesPEERDNSyesPEERROUTESyesIPV4_FAILURE_FATALnoIPV6INITyesIPV6_AUTOCONF…

Python 文件基础科普与文件打开技术详解【第117篇—文件打开技术】

Python 文件基础科普与文件打开技术详解 在Python编程中&#xff0c;文件操作是一项基础而重要的任务。无论是读取数据、写入文件还是进行其他文件处理操作&#xff0c;都需要对文件基础知识有一定的了解。在本文中&#xff0c;我们将首先介绍Python文件的基础概念&#xff0c…

哈希专题 - leetcode 1. 两数之和 - 简单难度

leetcode 1. 两数之和 leetcode 1. 两数之和 简单难度 哈希1. 题目详情1. 原题链接2. 基础框架 2. 解题思路1. 题目分析2. 算法原理3. 时间复杂度 3. 代码实现4. 知识与收获 leetcode 1. 两数之和 简单难度 哈希 1. 题目详情 给定一个整数数组 nums 和一个整数目标值 target…

【贪心算法】 55. 跳跃游戏

55. 跳跃游戏 解题思路 定义变量 n 来存储数组 nums 的长度。初始化 farthest 变量为 0&#xff0c;用于记录当前能够到达的最远距离。使用一个 for 循环遍历数组&#xff0c;但是不包括数组的最后一个元素&#xff0c;因为我们的目标是看是否能到达最后一个位置。在循环内部…

抽奖小程序怎么在线制作_引爆你的营销活动

抽奖小程序&#xff0c;轻松在线制作&#xff0c;引爆你的营销活动&#xff01; 在如今数字化时代&#xff0c;营销方式层出不穷&#xff0c;如何快速吸引用户眼球&#xff0c;提高品牌知名度&#xff0c;成为每个企业关注的焦点。今天&#xff0c;我要向大家介绍一款神奇的工…

用xshell7连接服务器,读取后台日志

有时候前端需要读取一些后台日志&#xff0c;比如&#xff0c;有时候接一些验证码啥的 或者有时候前后端不分离时&#xff0c;前端上线项目 先讲一下怎么用密码方式连接服务器 密码方式连接服务器 第一步&#xff0c;安装xshell&#xff0c;在新建会话中填写主机&#xff0…

Linux 下安装 Git

Linux 下安装 Git 1 参考2 安装2.1 通过 yum方式安装&#xff08;不推荐&#xff09;2.2 通过源码编译安装&#xff08;推荐&#xff09; 3 配置SSH 1 参考 Linux 下安装 Git 2 安装 2.1 通过 yum方式安装&#xff08;不推荐&#xff09; 在Linux上安装git仅需一行命令即可…

11 |「异步任务与多线程」

前言 实践是最好的学习方式&#xff0c;技术也如此。 文章目录 前言一、同步和异步的概念1、同步和异步任务2、线程 二、Android 多线程与 Handler 机制1、分类2、原则3、Handler 机制1&#xff09;问题&#xff08;背景&#xff09;2&#xff09;Handler 异步通信系统3&#x…

重塑生产格局:新质生产力引领下的新型工业操作系统和工业母机创新动向

新质生产力是创新起主导作用&#xff0c;摆脱传统经济增长方式、生产力发展路径&#xff0c;具有高科技、高效能、高质量特征&#xff0c;符合新发展理念的先进生产力质态。 **风口情报&#xff1a;**近日&#xff0c;中央经济工作会议首次提出“发展新质生产力”&#xff1b;…

glob path(python库)

glob 这里有两种方法导入glob mport glob #导入整个glob模块 from glob import golb #从glob模块导入glob函数 三种通配符 *代表0个或多个字符?代表一个字符[]匹配指定范围内的字符&#xff0c;如[0-9]匹配数字 #1、定义一个函数&#xff0c;搜索C盘下的所有文件和目录&…

作业1-32 P1059 [NOIP2006 普及组] 明明的随机数

题目 思路 根据题意&#xff0c;需要将读入的数据排序&#xff0c;去重。 参考代码 #include<bits/stdc.h> using namespace std; int n,a[5000],k;int main() {while(cin>>n){//读入数据for(int i0;i<n;i)cin>>a[i];sort(a,an);//排序int b[5000];in…

牛客 NC244138 剩下的数

链接&#xff1a;https://ac.nowcoder.com/acm/problem/244138 来源&#xff1a;牛客网 题目描述 牛牛有一个由 l … r l…r l…r 共 r − l 1 r−l1 r−l1 个整数组成的环。 牛妹对这个数环进行了 m m m 次询问&#xff0c;每次给定一个整数 x x x 问牛牛操作到不能继续…

python实例

设计者&#xff1a;ISDF工软未来 版本&#xff1a;v1.0 日期&#xff1a;2024/3/7 class Restaurant:餐馆类def __init__(self,restaurant_name,cuisine_type):#类的属性self.restaurant_name restaurant_nameself.cuisine_type cuisine_typeself.number_served 0def descri…

深度学习需要掌握哪些数学基础?

《深度学习的数学》这本书再合适不过了。作者罗纳德.T.纽塞尔&#xff08;Ronald T. Kneusel&#xff09;&#xff0c;拥有超过 20年的机器学习行业经验。 本书适合有一定深度学习基础、了解Python编程语言的读者阅读&#xff0c;也可作为用于拓展深度学习理论的参考书。 为什么…

贪心 Leetcode 738 单调递增的数字

单调递增的数字 Leetcode 738 学习记录自代码随想录 当且仅当每个相邻位数上的数字 x 和 y 满足 x < y 时&#xff0c;我们称这个整数是单调递增的。 给定一个整数 n &#xff0c;返回 小于或等于 n 的最大数字&#xff0c;且数字呈 单调递增 。 示例 1: 输入: n 10 输…

CKA考试必备:解锁Pod封装多容器的高级技巧!

往期精彩文章 : 提升CKA考试胜算&#xff1a;一文带你全面了解RBAC权限控制&#xff01;揭秘高效运维&#xff1a;如何用kubectl top命令实时监控K8s资源使用情况&#xff1f;CKA认证必备&#xff1a;掌握k8s网络策略的关键要点提高CKA认证成功率&#xff0c;CKA真题中的节点维…

Numpy中常用函数np.clip和np.finfo

NumPy&#xff08;Numerical Python&#xff09;是Python科学计算的核心库之一&#xff0c;提供了高性能的多维数组对象&#xff08;ndarray&#xff09;以及用于数组操作的各种函数和工具。 np.finfo finfo函数是根据括号中的类型来获得信息&#xff0c;获得符合这个类型的数…