- 博客(33)
- 问答 (1)
- 收藏
- 关注
原创 深度学习笔记001
本篇blog仅仅是本人在学习《动手学深度学习 Pytorch版》一书中做的一些笔记,感兴趣的读者可以去官网这里主要是记录个人对一些概念的理解,仅此而已。存在错误欢迎指出。
2024-05-09 20:49:43 710
原创 图像处理--空域滤波增强(原理)
线性滤波算法,采用的主要是邻域平均法。基本思想是使用几个像素灰度的某种平均值来代替一个原来像素的灰度值。可以新建一个M×N的窗口以为中心,这个窗口S就是的邻域。假设新的新的像素灰度值为,则计算公式为。
2024-05-05 23:30:30 651 1
原创 (C++) 树状数组
树状数组(Binary Indexed Tree,BIT),又称为 Fenwick 树,是一种高效的数据结构,主要用于动态维护数组的前缀和(或区间和),以及支持单点更新的操作。其核心思想是利用二进制的特性,通过巧妙地设计数据结构,对每一部分设置了一个“管理员”,管理员存储量其管理对象的所和,从而实现快速的区间查询和单点更新操作。因此当需要对前n和数据进行求和的时候就不需要遍历n次,只需要查询对应管理员中的数值即可。本篇仅仅介绍一维的树状数组,多维的原理和此是一样的。
2024-04-22 11:02:10 1000
原创 (C++) 稀疏表Sparse Table
简单来说,稀疏表就是,对于一个区间,想要快速找到其中的最大值(最小值),于是就划分为多个区间,按照一定的步长找到对应每一个小模块的最大值后映射到一个二维表中,这样下一次查找最值的时候,就能按照规定的规律直接进行检索。稀疏表采用了倍增的思想,在O(nlogn)时间构造了一个二维表之后,在O(1)时间在线查询[l ,r]区间的最值,有效解决区间最值问题。倍增的思想是在数据空间特别大的时候,快速进行查找搜索而使用的。的最值,其中 i 为该区间的起始点,j为搜索步长,区间长度为。继续比较,知道搜索到目标节点。
2024-04-17 13:10:27 387
原创 (C++) 拷贝构造函数
拷贝构造函数是C++中一个特殊的构造函数,用于创建一个类的对象作为另一个同类对象的副本。当一个对象以值的形式被传递给函数、从函数返回,或者用另一个同类对象直接初始化一个新对象时。例如,这行代码就会调用obj2的拷贝构造函数来初始化obj1。拷贝构造函数的主要作用是确保对象的正确复制,特别是当类成员包含指针或动态分配的资源时。在这种情况下,默认的拷贝构造函数只会进行浅拷贝(即复制指针的值而不是它指向的数据),这可能导致诸如资源共享或双重释放等问题。
2023-12-30 15:27:08 1034
原创 (C++)运算符重载
不同于Java的禁止以及C#的部分运算符允许重载,C++给了我们更大的操作空间,是 C++ 语言的一个特性,允许程序员给已有的运算符赋予额外的含义,以适应不同数据类型的操作。这使得代码更加直观和易于理解,特别是在处理复杂的数据结构如类和对象时。几乎所有的 C++ 内置运算符都可以被重载,除了(域运算符)、.*(成员指针访问运算符)、sizeof(长度运算符)和三元条件运算符?。对于一个运算符,其本质上是一个函数,它具有一个特殊的名称(例如,对于加法运算符’‘,函数名为'operator+')。
2023-12-25 09:00:00 375
原创 (C++) 01背包
01背包问题是计算机科学中经典的动态规划问题之一。在这个问题中,假设你有一个背包,它能承受一定的最大重量,以及一系列物品,每个物品都有特定的重量和价值。目标是确定应该将哪些物品装入背包,以便背包中物品的总价值最大,同时确保背包中物品的总重量不超过背包的承重限制。每种物品只有一个,要么不放入(0),要么放入(1),因此称为01背包。和贪心算法的局部最优解不同,01背包问题意在获得全局的最优解,对每一种物品都进行了决策。在理解原理之前不妨设想一下:你计划进行一次长途旅行,旅途中有多个景点可以选择参观。
2023-12-24 09:00:00 845
原创 (C++) BitMap位图的创建和bmp图片转换
位图(Bitmap)是一种图像文件格式,用于存储数字图像。在计算机图形学中,位图是基于像素的图像表示方式,每个像素具有特定的颜色值。位图是一种典型的栅格图形,由一个像素矩阵组成。每个像素在这个矩阵中占据一个固定的位置,并包含特定的颜色信息。位图数据可以表示为一个二维数组,其中每个元素代表一个像素。在内存中,这通常是一个线性数组,使用行优先或列优先的顺序存储。在位图中,每个像素的颜色通常由红色、绿色和蓝色(RGB)三原色的组合来表示。颜色深度(比如24位)决定了每个颜色通道(红、绿、蓝)的位数。
2023-12-20 20:45:01 1884 2
原创 (Python)简单的搭建神经网络
接下来,网络层在 nn.Sequential 中定义。nn.Sequential 是一个特殊的模块,它按照它们添加的顺序执行包含的子模块。1. nn.Conv2d(3, 32, 5, 1, 2): 2D 卷积层。
2023-12-07 18:44:59 830
原创 (C++)结构体struct
结构体在C++中存在的唯一意义就是为了希望与C保持向后兼容性,因为C没有class(类)但是有结构体,如果突然的去除结构体会失去两者的兼容性,C++的编译器无法识别struct。因此类中有的函数和操作同样是可以用于struct,但是两者还是有一些不同的。class和struct相同点1.struct 和 class 都可以包含成员变量和成员函数。2.两者都可以有构造函数和析构函数。3.struct 和 class 都可以被继承,也可以作为基类。4.
2023-12-04 23:06:00 339
原创 (C++)接口函数(抽象类)
在 C++ 中,虚函数是一种特殊的成员函数,它在基类中被声明,并在派生类中被重写以实现多态性。虚函数允许通过基类的指针或引用来调用派生类中的重写版本,这是面向对象编程中的一个重要特性。
2023-12-04 21:30:32 370
原创 数据结构:图——图的创建和两种遍历
形如上图的结构就是一个图。可以看出,其结构和树很相似,因此树是一个特殊的图,在途中的算法,比如说我们后面会提到的深度优先遍历或者广度优先遍历都可以在树中运用。并且,此图为一个无向图,即节点和节点之间的连接是没有方向的,即:A->B和B->A是一样的。我们描述一个图,用的是邻接矩阵的方法,即定义节点的个数vexNum = 5, 创建一个5×5的矩阵,用0和1(true or false)来描述两个节点之间是否通路。因此,在用代码进行描述“图”的时候,需要有四个参数。
2023-08-28 13:17:02 52 1
原创 数据结构:树——哈夫曼树
1、权值:当给这个数的每一个节点赋值的时候,所赋的值2、路径:两个相邻节点之间的连线3、路径数:从一个节点到另一个节点所经过路径的个数4、节点的带权路径长度:到某一个节点的路径数×次节点的权值5、树的带权路径长度:所有节点带权路径长度之和而哈夫曼树就是保证最小。
2023-08-18 16:13:13 68 1
原创 (C++)链表反转
这里的逻辑就是把每一个节点的指针反向,并更新头指针的位置。1. 是记录一下head的下一个节点 nextNode = head->next2. 让head的next指针指向新的头节点newHead3. 将newHead赋值为head4. 移动head到下一个节点 head = nextNode,并以此循环进行当再一次循环的时候,下一个节点就更新为newHead,但是之前节点的next仍然指向newHead,这样就让后面的节点到了前面,并以此类推。
2023-08-16 09:44:30 37 1
原创 (C/C++)动态二维数组的开辟
这个的原理也是比较容易理解的。首先二维数组的名称就相当于是一个二维指针,因此这里创建一个int类型的指针。然后是对这个指针进行初始化。次指针可以想象为一个线性的结构,因此初始化就相当于是在一个数组的每一个位置再插入一个数组。这也是为什么第一个内存开辟是column,因为横向的绳结个数就是列数。
2023-08-15 18:34:14 55
原创 (ROS)在VSCode上对C++程序进行配置
以为以后如果你的项目大,节点多,会忘记你自己设置的映射名称是什么,统一后就没有这个顾虑了。在学习ROS,我选择的IDE是vscode,虽然对于新手不是很友好,其难点在于对一些文件的配置比较繁琐,下面就是ROS运行C++程序的基本流程的框架。,选择catkin_make:build的设置进入,修改里面的内容,将一下的代码复制并替换进去。修改完成后,次快捷键是用来对你的程序进行编译,在ROS中,你需要频繁对你的代码进行编译。这三个,前两个就是你所用来写代码的编程语言,后面的一个是ROS里面用来通讯的。
2023-08-10 18:28:47 55 1
原创 (数据结构)在python下实现双向循环链表
关于数据结构,我个人认为最最基础的就是你需要在C上进行学习以及实现,这样才能在别的语言上进行复现,唯一需要的就是给你一个相对正式的模版,了解一下大概的实现逻辑和流程。这里我记录一下我在python上复现双向循环链表的代码。
2023-08-07 18:05:59 37 1
原创 (嵌入式)8.4 Ubuntu系统上运行cpp文件
这里的exe_name是运行文件的名称,可以自拟,就是把exe_name放到shell的搜索路径下。path就是刚刚加入路径的exe_name运行文件的路径,可以是相对路径,如下图。一般来说,exe_name是被添加在和file_name同名的文件夹下面,如图。file_name是执行文件,就是你所编写的代码的文件名。2. 用vscode打开cpp文件进行编写,编译,保存。1. 新建一个文件夹,里面新建一个cpp文件。input就是你的输入。
2023-08-04 10:39:59 192 1
原创 Ubuntu上vscode中C++编译配置
2. 首先创建一个文件夹,再对其进行编译,当然你要先安装cmake或者catkin_make,这就根据命令行的提示来就行。5. 在c_cpp_properties.json里面添加路径,参考文章。4. 新建一个cpp文件,再在里面进行编写。1.首先安装好gcc,在终端运行。3. 文件夹里面新建两个文件夹。6. 然后就可以进行运行啦。
2023-08-04 01:42:17 36 1
原创 Ubuntu下vscode中include报错的环境配置
在Linux系统中,vscode里使用include报错,显示需要更新include path的时候,试因为没有安装gcc或者路径没有配置好。在vscode中 ctrl+shift+p 进入搜索,输入json,选择c++环境配置进入。复制红色框中的路径信息。将刚刚复制的路径粘贴上去。
2023-08-03 23:59:47 204
原创 (数据结构)屉型二维双向链表
此结构有几个基本的名称,主链表(Main List),次链表(Subordinate List),节点(Node),标签(ID),主指针(main_pre, main_next),次指针(sub_pre, sub_next)。这个数据结构是我在做游戏的时候想到的,在对游戏中的图面数据进行处理的时候,想要提高对数据处理的速度,于是就诞生了这个数据结构,用来模拟抽屉式的形式,对数据进行存放和处理。参考如上的结构图,这个为梯型二维双向链表的结构,因为层层递进,每一层都可以存放不同数量的数据。
2023-07-31 22:55:56 63
原创 (C++)结构体中string类型成员的初始化
这个就是构造函数,里面用const string 接受传来的值,然后访问列表给结构体中的成员进行赋值。这里在用new开辟的时候,传入了ID 和 Stu 给构造函数,构造函数在对里面的对象进行初始化。这样才有下面的赋值操作。再c++中,如果使用了string在一个结构体或者类里面来创建了一个变量,则需要对它进行初始化。这里在结构体中要增加一个构造函数,用于在使用结构体创建一个对象的时候,能够对里面的string类型数据进行初始化。在创建新的结构体对象的时候,这里要用new来开辟内存,这样才能进行赋值。
2023-07-29 01:35:15 628
原创 数据结构——树:二叉排序树Binary Search Tree(BST)
定义第一个数据,即4,为root,一次从左到右开始排序。并且对于每一个一元二叉树(Single Binary Tree),左孩子的数据小于右孩子的数据,同时左孩子的数据小于root 的数据,右孩子的数据大于 root 的数据,将此规则定义为二叉排序树构造法则(BST-creating Rule),并以此开始递归。这里给出的想法是,以此node的右孩子开始,找到以T->rchild为root的树的最左边的node,将其值赋值给T,再执行函数bstDelete(),删除这个最左边的node,并以此类推。
2023-07-27 22:37:17 41 1
原创 查询Excel表格中不同Sheet下某一列中的不存在数据
3.COUNTIF()是Excel自带的函数,里面的‘7.21’是你需要去查找的sheet名称,注意用单引号(‘’),同时不能漏掉了感叹号(!其中,“$”符号是必要的,就理解为一种定义符号,只有加上它计算机才能理解你输入的是第几列第几行。1.在sheet1中标记出在sheet1中的A列存在,但是在sheet2的A列中不存在的数据。2.在sheet2中标记出在sheet2中的A列存在,但是在sheet1的A列中不存在的数据。结尾的“=0”是一种返回结果,在计算机语言中,0表示“否”,任何非0数表示为“真”。
2023-07-25 01:28:25 312
原创 (C++)数据结构——链表:在类中实现双向循环链表
这个头文件中的类就是链表的基本实现,可以在源文件中创建链表对象然后对其进行基本的操作。下面是源文件中的实现。在这里记录一下我实现的双向循环链表,一些接口函数我都实现了一遍。首先是命名为List.h的头文件。
2023-07-23 06:39:45 41
原创 数据结构——树:二叉树的线索化及后续构建遍历
对于这里的线索化二叉树,所有的遍历都是找到某个最左边的node,或者是找到上一个node,真正意义上的输出是子啊main中的for循环中实现的。情况二:当传递进来的为右孩子,则判断,如果该node的parent所指的右孩子为该node本身,则由tag赋值原理可知,node的左右孩子已经为空,其next是指向上一个node,即parent。若为空,则next为parent(这里是根据“tag赋值原理”得到的,因为当一个node的right node为空时,其右指针空间应该指向下一个node,即为next)
2023-07-21 22:14:18 59
原创 数据结构——树:二叉树的线索化及前序构建遍历
1.当T的左指针空间为0时,说明其指向了下一个节点,走preThreadTree(T->lchild, pre_node)直到找到最左边的node这里的逻辑和inOrder一样。但是在这里需要注意的是,由于do something在renew前面,所以可能会造成某个node为空,导致段错误,因此在renew的时候需要进行判断。前序遍历和中序遍历之间的关系就和三种递归遍历之间的关系是相同的。对于如上的一个二叉树,进行前序遍历(root-left-right),所得的List为:A-B-D-E-C。
2023-07-20 12:11:13 44
原创 数据结构——树:二叉树的线索化及中序构建遍历
这段 if 判断当某节点的左孩子为空的时候,根据tag赋值原理(tag-assignment theory),node中的左指针区域应该指向上一个node,同时 ltag = 1,这样就处理完成了了这个一元二叉树的左孩子。inThreadTree(T->child, pre_node) 进行递归,传入某节点的左孩子和上一个节点,直到出现 T == nullptr 的情况的时候,即找到了最左边的那个节点,然后开始递归开始返回,此时T,pre_node 和pre_node->rchild 构成一个一元二叉树。
2023-07-19 22:19:11 65 1
基于c++实现的贪吃蛇游戏
2023-08-27
学习深度学习,在构建数据集的时候遇到的问题
2023-04-05
import的自定义包没法使用里面的函数
2023-03-02
TA创建的收藏夹 TA关注的收藏夹
TA关注的人