自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(58)
  • 问答 (4)
  • 收藏
  • 关注

原创 模型可视化-TensorBoard

*嵌入式向量可视化:**如果模型包含嵌入层(如 Word Embedding),TensorBoard 可以将高维的嵌入向量映射到低维空间,并以可视化的方式展示,帮助用户理解嵌入向量之间的关系。**模型结构可视化:**TensorBoard 可以可视化 TensorFlow 模型的计算图,展示模型中各个层之间的连接关系,以及每个层的输入输出情况。**训练过程可视化:**TensorBoard 可以显示训练过程中的损失函数、准确率、学习率等指标的变化趋势,帮助用户监控模型的训练进度。

2024-04-16 10:45:05 369

原创 c++20 的部分新概念及示例代码-Contracts,Ranges

C++20 引入了 contracts(契约),这是一种编程范式,它允许程序员在代码中添加先决条件(preconditions)、后置条件(postconditions)和断言(assertions)等契约,以提高代码的可读性、可维护性和可靠性。Ranges 库,它提供了一组用于操作范围(例如容器、数组、迭代器等)的标准库组件,以更简洁、清晰和高效地处理数据。:Ranges 库引入了一些新的迭代器概念,如输入迭代器、输出迭代器、前向迭代器、双向迭代器、随机访问迭代器等,以支持不同类型范围的操作。

2024-04-01 15:34:22 926

原创 c++20 的部分新概念及示例代码-concepts,<=>,init-capture extension,coroutines

c++20 概念,三路比较符,初始化捕获,协程

2024-03-27 17:04:04 466

原创 c++ 关于共享指针在数组中的所有权转移

可以看到,在清空源 vector 后,目标 vector 仍然保留了原始。使用引用计数的方式来管理资源的生命周期,在没有其他持有者时自动释放资源。所管理的资源引用计数降为零时,资源会被释放。对象没有其他地方持有,它们的资源将会被释放。的所有权会发生变化。的资源,并正常进行了释放。以下是一个示例代码,展示了如何插入。对象所管理的资源会被转移给目标。对象会失去对资源的所有权。

2023-12-25 14:07:11 480

原创 C++ Core Guidelines 中文版 GSL

C++ GSL(Guideline Support Library)是由 Microsoft 开发的一个开源库,旨在提供一组通用的 C++ 标准库扩展,以支持 C++ 标准委员会提出的指导原则。GSL 为 C++ 开发人员提供了许多有用的工具和类型,以帮助他们编写更安全、更高效的代码。:GSL 包括用于执行数组边界检查、迭代器有效性检查等的工具。这有助于避免数组越界访问和迭代器失效等问题。:GSL 提供了类型,用于表示指针或引用不能为空,从而帮助避免空指针异常。

2023-11-14 10:41:05 1056

原创 C++ Core Guidelines 中文版 Introduction 简介

这是一套现代C++(目前为C++20和C++17)的核心准则,同时考虑到未来可能的增强和ISO技术规范(TS)。目的是帮助C++程序员编写更简单、更高效、更易于维护的代码。

2023-11-10 15:58:56 585

翻译 C++ Core Guidelines 中文版 Abstract 摘要

我们所说的“现代C++”是指有效使用ISO C++标准(目前是C++20,但我们几乎所有的建议也适用于C++17、C++14和C++11)。遵循这些规则将导致静态类型安全的代码,没有资源泄漏,并捕获比当今代码中常见的更多的编程逻辑错误。你会发现一些规则与你的期望相反,甚至与你的经验背道而驰。特别是,我们真的希望用测量或更好的示例来支持我们的一些规则。思考这些指南的一种方式是作为人类恰好可读的工具的规范。我们还需要更多的规则。随着我们对理解的提高以及语言和可用图书馆集的改进,我们计划修改和扩展本文档。

2023-11-10 15:21:09 273

原创 c++ 实现广度优先搜索

广度优先搜索(BFS)是一种用于遍历图或树的算法,它从一个起始节点开始,按照距离的顺序逐层遍历每个邻居节点,直到遍历完整个图或树。在C++中实现BFS可以使用队列数据结构来实现。

2023-10-31 15:20:29 234

原创 c++ 深度优先搜索

深度优先搜索(DFS)是一种用于遍历图或树的算法,它从一个起始节点开始,递归地遍历每个邻居节点,直到没有未访问的节点为止。在C++中实现DFS可以使用递归或堆栈数据结构来实现。其中,第一行是递归实现的DFS遍历结果,第二行是使用堆栈实现的DFS遍历结果。

2023-10-31 15:12:52 123

原创 c++实现迪杰斯特拉算法

需要注意的是,迪杰斯特拉算法只适用于边权重为非负数的情况。迪杰斯特拉算法的时间复杂度为O(|V|^2),其中|V|为节点数。如果使用堆优化的实现方式,时间复杂度可以降至O(|E|+|V|log|V|),其中|E|为边数。更新距离:对于与当前节点相邻的节点,计算从起点到这些节点的距离,并更新它们的距离值。如果新的距离值比原来的距离值更小,则更新距离值。初始化:将起点的距离设置为0,将其他节点的距离设置为无穷大。选择节点:从未访问的节点中选择距离起点最近的节点,将其标记为已访问状态。

2023-10-24 15:52:06 956 1

原创 c++实现哈夫曼编码的说明和实现

注意,由于哈夫曼树的性质,任何一个字符的编码都不是另一个字符编码的前缀,这被称为“前缀码”。哈夫曼编码是一种用于数据压缩的编码方法,它根据字符出现的频率来构建一棵二叉树,并将频率较高的字符赋予较短的编码,频率较低的字符赋予较长的编码。这是因为频率较高的字符被赋予较短的编码,而频率较低的字符被赋予较长的编码,从而使得整体的编码长度最小化。唯一编码:通过构建的哈夫曼树,每个字符都有唯一的编码。这是因为在哈夫曼树中,每个字符的编码都是通过不同的路径得到的,而路径上的0和1是不重复的。

2023-10-24 15:26:35 173

原创 c++ 模版元编程 算法

是 C++ 标准库中的一个常用算法函数,用于在容器范围内对元素进行转换操作,并将结果存储在另一个容器中。它接受输入范围的迭代器和输出范围的迭代器作为参数,以及一个一元操作函数或二元操作函数。转换算法用于将编译器常量或类型转换为其他类型,如。函数的返回值为输出范围的结束位置的迭代器。比较算法用于比较编译期常量或类型,如。元素访问算法用于访问元素或成员,如。使用示例: 下面是一个使用。

2023-09-28 15:08:20 150

原创 c++ 模版元编程-SFINAE(Substitution Failure Is Not An Error)技术

通过合理使用SFINAE技术,可以实现一些高级的模板元编程技巧,比如根据类型是否具有某种成员函数来选择不同的模板实现,或者根据类型是否满足某些条件来进行函数重载等。当使用模板进行类型推导时,C++编译器会尝试对所有可行的候选函数进行匹配,并选择最佳的匹配结果。SFINAE技术的作用就是在编译器遇到错误时,将错误视为普通的“替代失败”,从而继续尝试其他候选函数的匹配。是否为整数类型的条件,如果为真,则选择第一个函数模板,否则选择第二个函数模板。是否为指针类型或类类型的条件,根据不同的条件选择不同的特化实现。

2023-09-27 10:25:04 309

原创 c++模版元编程,基于递归的编程

基于递归的模版元编程允许在模版中进行递归调用,以便在编译时生成更复杂的代码。这种技术的核心思想是将问题分解为一个个较小的子问题,并通过递归地调用模版来处理它们。基于递归的模版元编程在C++中可以实现很多复杂的算法和数据结构。它可以用于生成高效的代码,避免运行时开销,并在一定程度上提高程序的性能。模版结构体,它通过递归地调用自身来计算斐波那契数列的值。模版结构体的特化用于处理基准情况(斐波那契数列的前两个元素)。来计算斐波那契数列的第10个元素,并将结果输出到控制台。在上述示例中,定义了一个。

2023-09-26 11:25:08 175

原创 c++ 模版元编程 基于条件的编译

基于条件的编译是指根据不同的条件选择是否编译某段代码或选择不同的代码路径。在 C++ 的模板元编程中,我们可以利用模板特化和技术来实现基于条件的编译。通过基于条件的编译,我们可以在编译期间根据类型特征或其他条件,决定采取不同的代码路径。这种能力使得我们可以针对不同类型或条件编写更加灵活和通用的代码。

2023-09-21 17:34:53 298

原创 c++模版元编程-可变参数模版

在 C++ 中,我们可以使用模板参数包(Template Parameter Pack)和展开表达式(Expanding Expression)来定义可变参数模板。

2023-09-20 15:12:45 133

原创 c++模版元编程-类模版

类模板是一种通用的类定义,其中的成员函数和成员变量的类型不是具体的类型,而是参数化的类型。类模板将模板参数作为类型参数,允许在编译时根据不同的类型生成不同的类。

2023-09-19 16:32:03 130

原创 c++模版元编程-函数模版

函数模板的定义: 函数模板的定义使用关键字template,后接模板参数列表和函数原型。模板参数列表可以包括类型参数、非类型参数或模板参数包。返回类型 函数名(参数列表)// 函数体typename或class关键字用于声明类型参数。例如,typename T定义了一个类型参数T。模板参数可以在函数原型中使用,作为函数的形参类型或返回类型的一部分。类内函数模板允许在类定义内部声明和定义函数模板,使得模板与类紧密关联,方便使用类的成员变量和成员函数。

2023-09-18 10:26:43 163

原创 BPE分词

构建词表: BPE算法通过统计训练语料中字符或子词的频率来构建词表。初始时,将训练语料中的字符或子词作为词表中的初始词汇。数据预处理: BPE算法首先对输入的训练语料进行预处理,将每个词按字符切分为序列,加上特殊符号(如开始符号和结束符号)。分词时,优先匹配较长的子词,当无法继续匹配时,再匹配较短的子词。合并操作: 选择最频繁出现的一对相邻字符或子词进行合并,形成一个新的字符或子词,并更新词表和频率统计。恢复原始文本: 将分词结果中的特殊符号去除,并将字符或子词连接起来,恢复为原始的文本形式。

2023-08-17 10:43:49 730

原创 C++线程池模式

1 简介: 线程池是一种常用的并发设计模式,用于管理和调度多个线程进行任务处理。线程池通过预先创建一组线程,并维护一个任务队列,从任务队列中获取任务并分配给空闲的线程执行,以提高系统的性能和资源利用率。上述代码中,客户端可以创建线程池对象并将任务添加到线程池中,线程池会自动调度线程执行任务。a. 定义任务类:首先,定义一个任务类,该类包含待执行的任务逻辑和数据。b. 实现线程池类:创建一个线程池类,该类包含线程池的管理和调度逻辑。

2023-08-16 15:59:02 74

原创 C++策略模式

它将算法封装成一个个具体的策略类,并使这些策略类可以相互替换,以达到动态改变对象的行为的目的。c. 创建环境类:创建一个环境类,用于保存当前使用的策略对象,并且提供一个方法来改变策略对象。上述代码中,客户端可以根据需求选择不同的具体策略来执行算法,通过改变策略对象,动态地改变行为。b. 实现具体策略类:创建实现策略接口的具体策略类,每个具体策略类都实现了算法方法。a. 定义策略接口:首先,定义一个策略接口,该接口声明了策略类中的算法方法。

2023-08-16 15:47:08 2076

原创 C++适配器模式

1 简介: 适配器模式是一种结构型设计模式,用于将一个类的接口转换为客户端所期望的另一个接口。适配器模式允许不兼容的类能够协同工作,通过适配器类来实现接口的转换和适配。上述代码中,客户端通过适配器来调用目标接口的方法,实际上适配器内部会调用适配者类的特定方法。c. 创建适配器类:定义适配器类,继承目标接口,并在适配器类中持有适配者类的实例。a. 定义目标接口:首先,确定客户端所期望的目标接口,即需要适配的接口。b. 实现适配者类:创建实现了适配者接口的类,该类是客户端需要适配的类。

2023-08-16 15:37:24 584

原创 C++工厂方法模式

1 简介: 工厂方法模式是一种创建型设计模式,用于通过一个公共接口来创建具体对象,而无需在客户端代码中显式指定其具体类。d. 实现具体工厂类:创建具体工厂类来实现工厂接口,根据客户端的请求创建相应的产品。上述代码中,客户端使用不同的具体工厂来创建不同的产品,并调用产品的操作方法。a. 定义产品接口:首先,定义一个产品接口,该接口声明了产品类的公共方法。c. 定义工厂接口:创建一个工厂接口,声明用于创建产品的工厂方法。b. 实现具体产品类:创建实现产品接口的具体产品类。

2023-08-16 15:17:38 273

原创 心跳功能:c++

是计算机系统、网络设备或软件应用程序中的一种监测机制,用于定期检测系统或设备的运行状态以及与其它组件之间的连接是否正常。它模拟人类心跳的概念,定期发送信号来确认系统的活动状态。心跳信号是一个小型的数据包或请求,用于发送给要监测的系统或设备。这个信号可以是一个简单的网络请求、ping 指令、或者自定义的应用层数据包。实际上,心跳功能的实现方式因系统的类型和需求而异。当心跳信号不再收到或连接丢失时,可以根据系统的需求来执行一系列操作。要监测的系统或设备需要实现一个接收机制,来接收并处理来自发送方的心跳信号。

2023-08-16 11:46:23 540

原创 模型训练 名词说明

训练步骤的每秒数可以作为一个性能指标,用于评估模型训练的效率和速度。较高的训练步骤每秒数通常表示模型训练速度快,而较低的数值可能意味着需要更长的时间来完成模型的训练过程。需要注意的是,训练运行时间受到多种因素的影响,包括训练数据的大小、模型的复杂度、硬件设备的性能以及优化算法的选择。要计算训练步骤的每秒数,可以通过记录每个训练步骤的起始和结束时间,并使用这些时间信息来计算平均每秒的训练步骤数。需要注意的是,训练步骤的每秒数还受到硬件设备的影响,例如CPU或GPU的性能以及数据加载和预处理的速度。

2023-08-14 15:49:00 2520

原创 c++库 Android调用

请注意,在封装C++库供Android调用时,您需要熟悉C++编程、Java编程和JNI的基本概念。使用JNI接口:在您的Android应用程序代码中,使用JNI接口调用C++库函数。您可以在Java代码中编写调用JNI接口的逻辑,从而实现与C++库的交互。创建一个新的Android项目并设置C++支持:在Android Studio中创建一个新的Android项目,并选择包含C++支持的选项。将C++库添加到项目中:将您的C++库源码文件(.cpp和.h文件)添加到项目的C++目录中。

2023-08-11 17:28:51 724

原创 c++:命令行参数

Google开源的C++库gflags(也称为Google Flags)是一个用于处理命令行参数(flags)的库,它旨在帮助开发人员轻松定义、解析和管理程序的命令行参数。gflags库提供了一种方便的方式来处理程序的配置选项,使得程序的配置更加灵活和易于管理。这会将标志的值设置为相应的参数值,然后程序会输出相应的信息。:除了命令行参数,gflags还支持通过环境变量来设置标志的值,这为程序配置提供了更多的灵活性。:gflags库可以自动生成命令行帮助信息,以便用户在使用程序时了解可用的命令行选项和标志。

2023-08-07 12:14:41 328

原创 所得杂记:KCP,QUIC,MQTT

UDP协议本身是一种无连接的、不可靠的传输协议,但在某些场景下需要一定程度的可靠传输,例如在线游戏、实时音视频传输等。发布/订阅模型:MQTT采用发布/订阅模型,其中设备可以发布(发布者)消息到一个特定的主题,其他设备可以订阅(订阅者)这些主题来接收消息。MQTT在物联网、传感器网络、移动应用、即时通信等场景中得到广泛应用,它的设计使得设备之间可以方便地进行实时通信,同时也支持强大的消息传递保证机制。安全性:QUIC默认支持加密,所有数据在传输过程中都是加密的,提供更高的安全性和隐私保护。

2023-08-07 12:06:29 986

原创 观察者模式

在这种模式中,一个主体对象(也称为主题或可观察者)维护一个列表,其中包含一组观察者对象。在客户端中使用观察者模式:创建观察者和主题对象,将观察者注册到主题上,并在需要的时候触发主题对象的通知方法。定义观察者接口(Observer Interface):创建一个纯虚类,定义观察者需要实现的方法,比如。创建具体主题类(Concrete Subject):实现主题接口,包含观察者列表,并在需要时通知观察者。创建具体观察者类(Concrete Observers):实现观察者接口,定义观察者的具体行为。

2023-08-04 13:57:26 63

原创 Qt网络通信

Qt网络通信

2023-08-02 16:26:15 1411

原创 PyTorch 单机多卡训练

以上是在 PyTorch 中进行单机多卡训练的两种方法。您可以根据自己的实际情况选择适合您的方式。在 PyTorch 中进行单机多卡训练可以使用。

2023-08-02 12:02:55 1346

原创 PyTorch 使用 NVLink 进行模型训练

通过这种方式,你可以利用 NVLink 连接的两个显卡同时进行训练,并获得加速性能。请注意,确保你的系统具有足够的显存来同时运行两个显卡上的模型和数据,并根据实际情况进行适当的调整。在训练循环中,对于每个子数据集和显卡,将数据分发到指定的显卡上,并进行前向传播、反向传播和梯度同步操作。接下来,将模型移动到指定的设备中,并根据显卡数量将数据集划分为多个子数据集。然后,使用不同的数据加载器将每个子数据集与相应的显卡对应起来。在示例代码中,首先指定要使用的显卡编号列表。然后,在设置设备时,通过。

2023-07-31 10:29:55 2761

原创 Spark Java的基本框架

的输入文件,您可以根据自己的需求修改输入文件的路径和实际的数据操作。上述代码假设您已经有一个名为。

2023-07-28 09:30:51 342

原创 c++ 内存屏障

C++内存屏障(Memory Barrier)是一种同步原语,用于控制多线程环境下的内存访问顺序和可见性。它可以确保在某个点之前的所有内存访问操作完成后,该点之后的内存访问操作才能开始。需要注意的是,内存屏障只能确保特定点之前和之后的内存访问顺序和可见性,不能解决所有的并发问题。内存屏障在C++中通过使用一些特殊的函数或指令来实现。表示在这个点之前的所有内存写入操作都会在这个点之前变得可见。,可以确保在该操作之前的所有内存写入操作对于加载操作可见。的加载操作就能看到之前所做的存储操作。

2023-07-28 09:30:28 963

原创 OpenCV使用

OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习库,提供了许多用于图像处理、计算机视觉和模式识别的函数和工具。它可以处理从简单的图像操作到复杂的计算机视觉任务。这只是 OpenCV 的一个简单示例,OpenCV 还提供了很多其他功能和算法,如图像滤波、特征提取、目标检测、相机标定等。您可以根据具体需求和文档进一步学习和探索 OpenCV 的更多功能。该示例使用 Python 编程语言,加载一张名为。

2023-07-27 13:37:27 57

原创 Qt 3D的简要使用

Qt 3D 是一个用于创建交互式 3D 图形应用程序的框架。它提供了一组类和函数,用于创建、渲染和操作 3D 场景。以上代码仅作为示例,实际使用时还需要根据具体需求进行适当的修改和补充。此外,Qt 3D 还提供了许多其他类和功能,可以根据需要进一步探索和应用。:这是 Qt 3D 框架的核心模块,包含了一些基本类和接口,用于构建 3D 场景和实体。:这个模块用于处理用户输入(例如鼠标和键盘事件),以及与用户交互的功能。:这个模块主要用于渲染图形对象,包括定义材质、纹理和着色器等。

2023-07-27 11:58:36 1357

原创 Qt qss

QSS(Qt Style Sheets)是一种用于设置 Qt 界面样式的机制,类似于 CSS。通过使用 QSS,你可以在不修改代码的情况下改变界面的外观,包括字体、颜色、背景、边框等。通过这种方式,我们可以使用 QSS 来自定义部件的样式,实现界面的个性化外观。你可以根据需要自由修改 QSS 字符串中的样式规则,以适应你的设计需求。字符串中,我们定义了一些样式规则,例如背景颜色、文字颜色、字体大小和内边距。的 QMainWindow 对象,并设置了窗口的标题。接下来,我们使用 QSS 来设置按钮的样式。

2023-07-27 11:06:10 160

原创 Qt 事件过滤

请注意,事件过滤器的范围不限于部件对象,你可以在任何继承自 QObject 的类上安装事件过滤器,例如窗口、对话框、应用程序等。同时,你可以在事件过滤器中处理多种类型的事件,并根据实际需求进行逻辑处理或拦截。在 Qt 中,事件过滤器是一种机制,允许你在一个对象上拦截和处理其他对象的事件。通过使用事件过滤器,你可以对特定的对象进行事件监视,并在事件发生时进行处理或拦截。函数中,你可以根据事件的类型和目标对象的需要进行相应的处理。通过安装事件过滤器,你就能够对目标对象的事件进行监视和处理。

2023-07-27 10:57:03 299

原创 Qt 事件处理

Qt 的事件处理是一项基本的技能,需要理解事件的概念、事件传递机制以及如何处理和过滤事件。Qt 中常见的事件处理接口。

2023-07-27 10:54:14 59

原创 Qt Widgets

以上列举了 Qt Widgets 模块中的一些主要类及其功能说明。Qt Widgets 还包含其他许多有用的类和控件,如菜单、工具栏、表格视图、文件选择对话框等。可以根据应用程序的需求选择适当的组件来构建直观且可交互的图形界面。详细了解每个类的更多功能和用法,请参考 Qt 官方文档。Qt Widgets 模块是用于创建传统桌面应用程序的 GUI 组件库。

2023-07-27 10:46:04 1157

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除