- 博客(74)
- 收藏
- 关注
原创 autoware自动驾驶框架课程
我有一套完整的autoware课程,睿幕课上原价要1399,现在免费送给大家,需要的,关注我,并私信我,我发你网盘链接。
2024-08-22 20:01:18
66
原创 c++中访问成员变量或函数什么时候用 . 什么时候用 -> 详解
在这个示例中,ptr 是一个指向 MyClass 对象的指针,通过 ptr->value 和 ptr->display() 访问 value 成员变量和 display 成员函数。在 C++ 中,. 和 -> 是访问对象成员的两种运算符,用于访问类的成员变量和成员函数。它们的使用场景与对象的类型有关。用法: pointer->member,其中 pointer 是指向对象的指针,member 是对象的成员变量或成员函数。使用箭头运算符 -> 来访问对象的成员,当你操作的是指向对象的指针时。
2024-08-05 10:05:23
414
原创 二叉树的遍历详解
这些遍历方式在不同的场景中有不同的应用,例如前序遍历用于复制树,中序遍历用于排序检查,后序遍历用于释放资源,而层序遍历用于按层级处理树结构。二叉树的遍历是指访问二叉树中每一个节点的过程。根据访问节点的顺序,遍历可以分为不同的类型。前序遍历:访问根节点,递归遍历左子树,递归遍历右子树。中序遍历:递归遍历左子树,访问根节点,递归遍历右子树。后序遍历:递归遍历左子树,递归遍历右子树,访问根节点。层序遍历:使用队列逐层访问节点。
2024-08-03 17:57:54
288
原创 二叉树 为啥要尽量确保树的高度是对数级别
确保树的高度是对数级别(通常指 𝑂(log𝑛))是为了确保树的基本操作(如插入、删除和查找)在最坏情况下的时间复杂度是对数级别。插入操作:在保持树的高度为对数级别的情况下,插入新节点的操作也能在 O(logn) 时间内完成。虽然树的节点总数可能很大,但树的深度较小意味着操作的时间复杂度保持在对数级别,减少了在操作中可能需要的额外空间。最坏情况:如果树的高度不受限制,最坏情况下树可能会退化为一条链表,这样查找、插入和删除操作的时间复杂度将退化为 O(n),这对于大规模数据结构来说效率很低。
2024-08-03 11:09:19
365
原创 ros2 pluginlib详解
pluginlib 是 ROS (Robot Operating System) 中用于动态加载和管理插件的库,它简化了插件的使用和管理。pluginlib 提供了一种机制,使得主应用程序能够在运行时根据需要加载、使用和卸载这些插件,而不需要在编译时将插件链接到主应用程序中。接口通常定义了插件需要实现的功能,而具体的插件类则实现了这些功能。pluginlib 可以在运行时查找并加载包含插件的共享库(例如 .so 文件),这使得插件的管理和使用变得更加灵活。这些是具体的插件类,实现了插件接口定义的功能。
2024-07-29 19:48:18
377
原创 linux 下souce和 export详解
source 是一个在 Unix-like 操作系统(如 Linux 和 macOS)的 shell(如 bash、zsh、sh)中使用的命令。它用于执行指定文件中的命令,并将这些命令在当前 shell 会话中执行。source 命令通常用于加载配置文件或脚本文件,使得这些文件中的变量和函数在当前 shell 会话中生效。:要执行的脚本或配置文件的路径。在这个示例中,source 命令将执行位于用户主目录下的 .bashrc 配置文件,使得文件中的环境变量和配置在当前 shell 会话中生效。
2024-07-28 17:51:38
1258
原创 ros2 rclpy 详解 --创建 python类型节点
它提供了与 ROS 2 系统交互的 API,使开发者能够使用 Python 编写 ROS 2 节点、发布和订阅消息、调用服务、定时器等。rclpy 是 ROS 2 的核心库之一,为 Python 开发者提供了与 ROS 2 系统进行通信的能力。rclpy 是 ROS 2 的 Python 客户端库,提供了创建节点、发布和订阅消息、调用服务、定时器等功能。通过理解和使用 rclpy,可以构建功能强大的 ROS 2 应用程序,并与 ROS 2 系统进行高效的交互。
2024-07-28 11:44:43
363
原创 ros2的几种通信方式总结
服务是一种基于请求-响应模式的通信机制。异步:发布者和订阅者之间的通信是异步的,即发布者可以在任何时间发送消息,订阅者在它准备好时接收消息。适合实时性要求高的场景:由于请求和响应是同步的,这使得服务适合那些需要确定性响应的应用场景。这几种通信机制各自有其适用的场景,可以根据具体的需求选择合适的方式来实现机器人系统的通信。适合实时性不高的场景:由于消息的传递是异步的,话题机制不适用于要求严格实时性的应用场景。适用于需要在运行时调整节点配置的场景(如调整PID控制器的参数、配置传感器的工作模式)。
2024-07-28 01:06:08
373
原创 c++ typedef 关键字详解
typedef 关键字在 C++ 中用于创建类型的别名,可以帮助简化代码,提高可读性和可维护性。别名与using:在 C++11 及更高版本中,using 关键字提供了与 typedef 类似的功能,但语法上更简洁,且支持模板别名。类型别名的作用范围:typedef 创建的别名在其作用范围内有效。这里,existing_type 是已有的类型,new_name 是你为它创建的新别名。便于模板使用:typedef 在处理模板时尤其有用,因为它可以简化复杂的模板类型定义。
2024-07-27 15:40:11
251
原创 linux进程 线程详解
在 Linux 操作系统中,进程是执行中的程序的实例。理解进程及其管理是系统编程、性能调优和系统管理的基础。以下是对 Linux 进程的详细介绍,包括进程的基本概念、生命周期、管理以及常用的命令和工具。基本概念进程(Process):进程是程序在执行中的实例。每个进程都有一个唯一的进程标识符(PID)以及一组资源(如内存、文件描述符等)。线程(Thread):线程是进程内的一个执行单元。一个进程可以包含多个线程,共享进程的资源和内存。
2024-07-25 18:17:05
880
原创 ASLR特性详解
ASLR 是一种有效的安全技术,通过随机化程序和库的内存地址布局来防止特定类型的攻击,如缓冲区溢出攻击。ASLR(Address Space Layout Randomization,地址空间布局随机化)是现代操作系统中一种重要的安全特性,用于防止某些类型的攻击,如缓冲区溢出攻击。它通过随机化进程的地址空间布局来增强系统的安全性。不同操作系统可能有不同的 ASLR 实现和配置方式,但它们的目标是一致的:通过随机化内存布局来提高安全性。这样,即使攻击者知道某个库的存在,它的地址也会变化,增加了攻击的复杂性。
2024-07-25 17:59:07
262
原创 Linux 系统动态库 RUNPATH
当程序在运行时需要加载共享库(动态库)时,动态链接器(ld.so 或 ld-linux.so)会根据 RUNPATH 和其他路径(如 LD_LIBRARY_PATH)查找这些库。在这个命令中,-Wl,-rpath,/path/to/libs 将 RUNPATH 设置为 /path/to/libs,这样在程序运行时,动态链接器会在这个路径中查找需要的共享库。如果在上述路径中没有找到库,动态链接器会查找系统默认的库路径,如 /lib 和 /usr/lib。RPATH 是另一种用于指定库查找路径的机制。
2024-07-25 17:40:02
338
原创 查看ubuntu系统中g++ 编译时默认的标准系统目录中的头文件
在 Ubuntu 系统中,g++ 编译器在编译时会使用一系列默认的系统目录来查找头文件。这些目录通常包括 C++ 标准库、标准头文件以及其他一些系统库的路径。具体的路径可能会有所不同,取决于你的 g++ 版本和安装配置,但常见的系统目录包括:常见的默认系统头文件目录C++ 标准库头文件:/usr/include/c++//:这是 C++ 标准库的主要目录, 表示你的编译器版本号,例如 9, 10, 11 等。示例:/usr/include/c++/11/
2024-07-25 16:49:54
787
原创 g++ -I参数详解 指定编译器头文件查找路径
g++ 的 -I 参数用于指定编译器在编译过程中查找头文件的目录。在这个命令中,/path/to/headers 是包含头文件的目录,my_program.cpp 是你的源代码文件,my_program 是编译生成的可执行文件。-I 参数添加的路径会被添加到编译器默认的头文件搜索路径之前。即编译器首先会在 -I 指定的路径中查找,然后才会在系统默认路径中查找。当多个 -I 路径中都包含相同的头文件时,编译器会优先使用第一个找到的头文件。-I 后面跟随的路径会被添加到编译器的头文件搜索路径列表中。
2024-07-25 16:31:49
399
原创 python元组tuple详解
元组是一种不可变的有序数据结构,用于存储一组相关的数据。由于元组的不可变性,它们通常用于存储不需要改变的数据。元组解包是一种非常方便的操作,可以将元组中的元素快速赋值给多个变量。Python 中的元组(tuple)是一种有序的、不可变的数据结构,用于存储一组相关的数据。元组与列表非常相似,但它们最大的区别在于元组一旦创建就不能修改(即不可变),而列表是可变的。不变的数据集合:当你有一组数据不希望被修改时,可以使用元组,例如,函数的参数和返回值。字典键:由于元组是不可变的,因此可以作为字典的键。
2024-07-24 16:55:55
328
原创 深度学习中embedding详解
它通过最小化单词对的共现概率与其嵌入向量的点积之间的差异来学习单词的嵌入。嵌入是指通过某种映射函数,将高维空间的数据(例如单词、图像、用户)转换为低维空间中的向量表示。在推荐系统中,矩阵分解技术(如SVD、ALS)用于将用户-物品交互矩阵分解为低维的用户嵌入和物品嵌入,从而进行推荐。图嵌入技术用于将图中的节点表示为向量,常见的方法包括DeepWalk、Node2Vec、GraphSAGE等。通过嵌入技术,可以有效地将复杂、高维的数据表示为低维向量,便于后续的分析和处理,提高模型的性能和效率。
2024-07-24 15:06:23
405
原创 机器学习中分类和回归的区别
分类和回归在机器学习中都有广泛的应用,选择哪种方法取决于问题的性质。如果目标是预测连续数值,使用回归方法。理解两者的区别和应用场景,有助于选择合适的算法和模型来解决具体的问题。回归: 回归模型训练过程中,会根据训练数据中的连续数值标签进行调整,使模型能够尽量减小预测值与真实值之间的误差。分类和回归是机器学习中两种基本的任务类型,它们有着不同的目标和应用场景。分类: 分类模型训练过程中,会根据训练数据中的类别标签进行调整,使模型能够准确地预测输入数据的类别。回归是指预测一个连续的数值。目标是预测一个实数。
2024-07-24 09:47:14
406
原创 python assert详解
assert 是一个有用的调试工具,帮助开发者在开发阶段捕捉潜在的逻辑错误和不一致性。对于关键的输入验证,应使用异常处理机制,以确保程序在任何环境下都能正常运行。assert 是 Python 中用于调试和验证程序中条件的一个重要语句。它可以在程序中某些关键点检查条件是否为真,如果条件为假,则抛出 AssertionError 异常并终止程序执行。message:(可选)在抛出 AssertionError 时输出的错误信息,用于描述断言失败的原因。在这种模式下,所有的断言都将被跳过,不会进行条件检查。
2024-07-19 16:48:59
570
原创 from torch.utils.data import Dataset详解
torch.utils.data.Dataset 是 PyTorch 数据加载库中的一个重要类,用于定义自定义数据集。通过继承 Dataset 类,可以创建自己的数据集类,并实现数据的加载和处理逻辑。通过继承和实现 torch.utils.data.Dataset 类,可以灵活地创建自定义数据集,并与 DataLoader 结合使用,实现高效的数据加载和处理。(self, idx):支持索引操作,返回指定索引的样本。继承 Dataset 类,并实现。方法中加载文件数据。2.1 导入相关模块。
2024-07-19 16:38:23
370
原创 python装饰器@详解
Python 的装饰器(decorators)是一种强大的编程工具,用于修改或增强函数或方法的行为,而无需修改函数或方法的源代码。在上面的例子中,my_function 实际上被 decorator2 和 decorator1 装饰,装饰顺序从内到外,即 decorator2 包裹 decorator1。装饰器本质上是一个函数,它接受另一个函数作为参数,并返回一个新函数。装饰器 是一个函数,用于修改或增强另一个函数的行为。带参数的装饰器 需要通过装饰器工厂模式来实现。使用 @ 符号将装饰器应用到函数上。
2024-07-19 12:45:00
443
原创 python self详解
在 Python 中,self 是一个约定俗成的名称,用于类的方法中,表示当前对象的实例。它并不是 Python 的关键字,而是一个约定,可以使用其他名称,但使用 self 是一种编程规范,使代码更具可读性和一致性。self 代表类的实例,允许在类的方法中访问该实例的属性和其他方法。它是实例对象的一个指针,使得类的方法可以访问和修改实例的状态。self 用于访问和修改实例的属性,以及调用其他实例方法。在类的方法中,self 用于访问和修改实例属性。在类的方法中,self 可以用来调用其他方法。
2024-07-19 12:34:05
998
原创 python内置变量详解
Python 内置变量和特殊方法提供了丰富的功能和灵活性,使得 Python 的对象和模块可以实现自定义行为,方便进行复杂的数据处理和程序控制。通过理解和使用这些内置变量,你可以更好地掌握 Python 的高级功能和编程技巧。Python 内置变量是 Python 解释器自动定义的一些特殊变量和对象。通过实现这些方法,可以定义对象如何处理索引操作。方法,可以定义对象如何处理 len() 函数。通过重载这些特殊方法,可以定义对象的比较行为。通过重载这些特殊方法,可以定义对象的比较行为。属性访问文档字符串。
2024-07-19 12:21:03
620
原创 python条件语句详解
Python 中的条件语句提供了丰富的工具来控制程序的执行流程。通过结合使用 if、elif、else、逻辑运算符、三元运算符、嵌套条件和结构化模式匹配,你可以处理各种复杂的逻辑判断需求。合理使用这些条件语句,可以使你的代码更加简洁、可读和高效。Python 中的条件语句用于根据某些条件执行不同的代码块。它们是控制程序流的重要工具。以下是 Python 中所有条件语句的详细介绍。当任意一个条件为真时,结果为真。取反运算符,将条件的布尔值取反。当所有条件都为真时,结果为真。
2024-07-19 11:17:18
115
原创 python with关键字详解
Python 的 contextlib 模块提供了一些工具,可以更方便地创建上下文管理器。context_variable 是一个可选的变量,用于接收 context_expression 返回的对象。方法或使用 contextlib 模块,我们可以轻松创建和使用自定义的上下文管理器,从而使代码更加简洁和健壮。context_expression 是一个返回上下文管理器(context manager)的表达式。with 语句通过上下文管理器简化了资源管理和清理工作,确保资源在使用后被正确释放或清理。
2024-07-19 10:51:08
248
原创 torch.no_grad()详解
torch.no_grad() 是一个用于禁用梯度计算的上下文管理器,适用于模型评估、推理等不需要梯度计算的场景。在使用 torch.no_grad() 时,通常还会将模型设置为评估模式(model.eval()),以确保某些层(如 dropout 和 batch normalization)在推理时的行为与训练时不同。torch.no_grad() 可以嵌套使用,内层的 torch.no_grad() 仍然会禁用梯度计算。进入 torch.no_grad() 上下文,临时禁用梯度计算。
2024-07-19 10:46:01
707
原创 from torch.utils.data import TensorDataset 详解
这里,x 是一个形状为 (100, 10) 的张量,表示 100 个样本,每个样本有 10 个特征。y 是一个形状为 (100,) 的张量,表示 100 个样本的标签,取值在 0 和 1 之间(二分类问题)。在这个实例中,我们创建了一个包含 100 个样本的数据集,每个样本有 10 个特征,并将其划分为批次,每个批次包含 20 个样本。这里,我们创建了一个数据加载器 train_dataloader,每个批次包含 20 个样本,并且在每个 epoch 结束后会打乱数据(shuffle=True)。
2024-07-19 10:01:38
341
原创 python len 详解
len 函数的使用非常简单,只需将目标对象作为参数传递给它即可。无论是计算字符串的字符数、列表中的元素数、元组中的元素数、字典中的键值对数,还是集合中的元素数,len 函数都能快速、准确地返回结果。len 是 Python 中的一个内置函数,用于返回对象的长度。该函数的常见使用对象包括字符串、列表、元组、字典、集合等。
2024-07-19 09:39:08
190
原创 目标检测中的head详解
在目标检测任务中,“Head”是网络的最后一部分,它从“Neck”提供的特征图中生成最终的检测结果,即目标的类别和边界框信息。不同的目标检测方法可能会有不同的Head设计,但其核心功能都是对特征图进行处理,输出目标的类别和位置。不同的目标检测算法可能有不同的Head设计,但其核心任务都是进行目标的分类和边界框回归。回归分支:用于预测每个锚框的边界框回归参数,即目标框的位置和大小。独立的分类和回归分支:每个尺度的特征图都有独立的分类和回归分支。单一输出层:YOLO在单一输出层上预测所有锚框的类别和位置。
2024-07-19 00:06:13
391
原创 详解目标检测中的Neck
Neck的主要目的是生成特征金字塔,以便捕捉不同尺度的信息,从而提高检测性能。Neck模块在现代目标检测架构中扮演了重要角色,通过生成多尺度的特征金字塔,帮助网络更好地捕捉不同大小和形状的目标。下采样和上采样:Neck模块通常会进行特征图的下采样和上采样操作,以便更好地捕捉不同尺度的信息。提高特征表示能力:通过Neck模块,可以增强特征的表达能力,特别是对于小目标和复杂场景的检测。多尺度特征融合:Neck模块通过融合来自不同层次的特征,帮助网络更好地检测不同尺度的目标。目标检测中的典型架构。
2024-07-18 23:36:29
411
原创 详解目标检测中的anchors
示例假设特征图的大小为 7×77×7,每个单元格有3种尺度(128x128、256x256、512x512)和3种比例(1:1、1:2、2:1),那么每个单元格将有9个 anchors,总共有 7×7×9=4417×7×9=441 个 anchors。在网络的特征图上,每个位置通常都会有多个 anchors,这些 anchors 有不同的大小和纵横比,以适应各种目标的形状和大小。这通常通过交并比(IoU)来衡量。回归调整:对于正样本的 anchors,网络学习预测与地面真实框的偏移量(即边界框的回归)。
2024-07-18 23:26:41
539
原创 c++类模板详解
通过理解类模板的定义、成员函数、多个模板参数、默认模板参数、继承、实例化和部分特化,开发者可以编写更加通用和灵活的代码,提升软件的可维护性和可扩展性。C++类模板是C++泛型编程的重要特性之一,允许类定义中的数据类型在实例化时指定,从而实现代码的重用和灵活性。类模板可以用来创建通用的类,而不必针对每种可能的数据类型编写单独的类。在类定义中,所有出现 T 的地方将由实例化时传递的具体类型替换。类模板可以有成员函数,与普通类的成员函数一样。类模板在使用时需要实例化,实例化时必须指定模板参数,除非参数有默认值。
2024-07-18 22:54:13
472
原创 c++关键字override
override 关键字是 C++11 引入的,用于显式指示派生类中的函数重写了基类中的虚函数。在 C++ 中,override 是一个关键字,用于显式指示派生类中的函数重写了基类中的虚函数。如果 Derived 类中的重写函数与基类中的虚函数签名不匹配,编译器会报错。例如,如果 show 函数的参数类型为 double,而基类中没有匹配的虚函数,编译器会给出错误。编译时检查:如果函数签名不匹配或基类中没有虚函数,会导致编译错误。使用 override 关键字明确表示这些函数是重写基类中的虚函数。
2024-07-18 21:43:12
184
原创 c++类的继承详解
继承是面向对象编程的重要特性之一,允许一个类(派生类)继承另一个类(基类)的属性和方法。C++ 支持多种类型的继承,包括公共继承、私有继承和保护继承。菱形继承问题发生在一个派生类通过不同路径继承同一个基类时,造成基类成员的多份拷贝。继承类型:公共继承、保护继承和私有继承,控制基类成员在派生类中的访问权限。多重继承:一个派生类可以同时继承多个基类,需小心命名冲突和菱形继承问题。在保护继承中,基类的公共和保护成员在派生类中变为保护成员。在私有继承中,基类的公共和保护成员在派生类中变为私有成员。
2024-07-18 21:41:48
395
原创 c++类的成员变量详解
C++ 类的成员变量是类的一部分,用于存储类的状态或属性。C++ 提供了多种类型的成员变量,包括普通成员变量、静态成员变量、常量成员变量、可变成员变量(mutable)和引用成员变量。理解和使用这些成员变量类型,可以帮助开发者更好地设计和实现类及其行为,确保数据的封装和安全性。引用成员变量:指向其他变量的引用,必须在初始化列表中初始化。私有成员变量:只能在类内部访问,通常通过公共成员函数访问。保护成员变量:在类外部不可访问,但在派生类中可以访问。普通成员变量:每个对象有自己独立的成员变量。
2024-07-18 20:51:55
222
原创 c++this指针详解
this 指针是 C++ 中的一个特殊指针,用于指向调用成员函数的对象。常量成员函数:在常量成员函数中,this 指针的类型是 const,即 MyClass* const,因此不能修改对象的成员变量。指向调用对象:this 指针指向调用成员函数的对象,可以用来访问对象的成员变量和成员函数。静态成员函数:this 指针不能在静态成员函数中使用,因为静态成员函数不属于任何对象实例。通过 this 指针,可以访问调用对象的成员变量和成员函数。this 指针在成员函数内部指向调用该函数的对象。
2024-07-18 18:20:14
335
原创 c++类的成员函数详解
C++ 类的成员函数是类的一部分,用于定义类的行为和操作。成员函数可以访问类的成员变量,并且可以在类的对象上调用。成员函数有几种类型,包括普通成员函数、静态成员函数、常量成员函数和虚成员函数。静态成员函数:属于类,可以访问静态成员变量,但不能访问非静态成员变量。常量成员函数:不能修改类的成员变量,除了 mutable 变量。虚成员函数:用于实现多态性,允许在派生类中重写基类的成员函数。友元函数:不是类的成员函数,但可以访问类的私有和保护成员。普通成员函数:执行特定操作,可以访问和修改类的成员变量。
2024-07-18 18:11:35
215
原创 ubuntu操作系统学习记录
dpkg 是 Debian 包管理器,Ubuntu 基于 Debian,因此可以使用该命令查看已安装的软件包列表。dpkg -l该命令会列出所有已安装的软件包以及它们的版本信息。
2024-07-18 17:06:51
206
原创 c++ 几种循环方式详解
condition: 每次循环迭代前进行的条件检查。break 语句用于立即退出循环,无论循环条件是否满足。通常用于提前结束循环。continue 语句用于跳过当前循环迭代的剩余部分,并立即开始下一次迭代。break 和 continue 控制语句:用于更灵活地控制循环的执行。范围基于 for 循环:用于遍历容器中的每个元素(C++11 引入)。while 循环:用于在条件为 true 时反复执行循环体。increment: 每次循环迭代后执行的更新语句。do-while 循环:先执行循环体,再检查条件。
2024-07-18 16:58:22
392
C++面试总结手册.pdf
2024-07-20
2024.1.8新版CUDA 官方文档CUDA_C_Programming_Guide.pdf
2024-07-20
LeetCode刷题题解答案(c++).pdf 彻底搞懂了编程算法题,成功拿到了大厂offer!
2024-07-20
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人