自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(62)
  • 收藏
  • 关注

原创 梯度下降算法总结

总的来说,梯度下降的步骤就是不断地计算梯度、更新参数,并重复这个过程直到达到停止条件。这样就可以逐步优化目标函数,找到其局部最小值或全局最小值。但是我们直接求解不一定能算出θ。所以我们用到这种慢慢逼近这个最优解,求最优解。我们知道线性回归其实其本质就是求θ。1、我们为什么要用梯度下降算法。

2024-05-23 07:47:07 41

原创 机器学习中线性回归算法的推导过程

线性:因变量(通常是我们想要预测的变量)与自变量之间的关系可以用一个线性方程来描述。回归:建立一个模型,该模型能够描述因变量与自变量之间的关系,并且可以用来预测因变量的数值。

2024-05-05 22:39:09 437

原创 机器学习的分类

机器学习主要分为有监督学习、无监督学习、半监督学习和强化学习。

2024-05-02 13:36:39 13

原创 transformer中,多头注意力机制

多头注意力机制之所以在自注意力机制中使用,是因为自注意力机制需要在序列中建立全局的依赖关系,而多头注意力机制能够帮助模型捕捉到不同位置之间的不同关系,从而更好地理解输入序列的结构和语义信息。具体来说,自注意力机制通过计算每个位置与序列中所有其他位置的注意力权重,然后将这些权重与相应位置的表示进行加权求和,从而生成每个位置的上下文相关表示。而多头注意力机制则在自注意力机制中并行计算多个注意力头的输出,然后将它们连接起来,最后经过线性变换得到最终的输出。

2024-04-23 22:44:19 228

原创 transformer中,{tensor:(16,3,244,244)} 的含义

在计算机视觉中,通常使用RGB(红、绿、蓝)颜色通道来表示图像,所以这个维度表示每个样本具有 3 个颜色通道。因此,这个Tensor表示了一个包含 16 个图像样本的数据集,每个图像样本具有 3 个通道(RGB),并且每个图像的尺寸为 244x244 像素。这个Tensor的形状是 (16, 3, 244, 244),它表示了一个四维的张量。第三个维度height(244):表示每个样本的高度为 244 像素。这个维度表示图像的高度。第四个维度width(244):表示每个样本的宽度为 244 像素。

2024-04-22 22:09:49 190

原创 卷积层、池化层和全连接层的作用分别是什么

总的来说,卷积层用于特征提取和参数共享,池化层用于降采样和特征压缩,全连接层用于特征组合和分类预测。这三种层类型共同构成了深度学习模型中重要的组成部分,各自发挥着关键的作用,帮助神经网络学习并表达复杂的数据模式。

2024-04-21 20:46:04 350

原创 联为机器视觉的课程笔记

用到的算子包括affine_trans_image(仿射图像)、affine_trans_region(仿射区域)、极坐标与笛卡尔坐标互转 polar_trans_region, polar_trans_region_inv。用到的算子包括hom_mat2d_translate(平移)、hom_mat2d_rotate(旋转)、4)创建具有缩放比的模板 create_scaled_shape_model。8)获取模板的位置 get_shape_model_region。

2024-04-14 13:52:37 700

原创 python中,深拷贝和浅拷贝的区别

浅拷贝是创建一个新的对象,该对象具有与原始对象相同的内容。但是,如果原始对象包含其他对象(如列表、字典等),浅拷贝仅复制对象的引用,而不是创建新的对象。这意味着修改原始对象中的嵌套对象将会影响到浅拷贝的对象。深拷贝是创建一个全新的对象,其中包含原始对象及其所有嵌套对象的副本。换句话说,深拷贝不仅复制了原始对象的值,还复制了原始对象的所有嵌套对象。我们修改了原始对象中的嵌套列表,然后分别打印了原始对象、浅拷贝对象和深拷贝对象。可以看到,浅拷贝对象的嵌套列表也被修改了,而深拷贝对象的嵌套列表保持不变。

2024-01-07 19:15:14 420

原创 Qt中,信号与槽的原理及观察者模式的应用

连接可以通过QObject的connect()函数来创建,该函数接收信号源对象、信号的名称、槽函数的目标对象和槽函数的名称作为参数。通过将信号与槽函数进行连接,当信号被发射时,与之连接的槽函数将被调用。一个对象可以发射多个信号,多个对象可以连接到同一个信号上,一个对象可以连接多个槽函数,甚至还可以在不同线程中进行信号与槽之间的通信。在该模式中,当一个对象的状态发生变化时,它会自动通知所有依赖于它的其他对象,使它们能够及时作出相应的响应。它基于观察者模式,通过发射信号和连接槽函数来实现对象之间的通信。

2024-01-07 17:17:28 1691

原创 C++11,移动语义

首先,对于可移动的对象,应该实现移动构造函数和移动赋值运算符,并将资源的所有权正确地转移。通过使用std::move,我们可以将一个对象的资源有效地转移到另一个对象中,而不需要进行昂贵的拷贝操作。使用移动构造函数和移动赋值运算符,我们可以在不进行不必要的资源拷贝的情况下,高效地转移资源,并使代码更加简洁和高效。总之,移动语义是C++11引入的一个重要特性,它通过引入右值引用和移动构造函数/移动赋值运算符,提高了对象的移动效率和资源的利用率,从而使程序更加高效和性能更好。它是实现移动语义的重要工具之一。

2024-01-07 17:03:37 452

原创 C++中,Lambda表达式和std::function的作用及区别

std::function的作用是提供一个通用的函数对象包装器,可以用于存储和调用任何可调用对象,包括函数指针、函数对象和Lambda表达式。std::function提供了一种统一的接口来处理不同类型的函数对象,使得它们可以像普通函数一样进行调用。综上所述,Lambda表达式和std::function在功能和使用上有所差异,根据具体的需求可以选择合适的方式来处理函数对象。Lambda表达式适用于临时定义的简短函数逻辑,而std::function适用于需要存储和传递不同类型函数对象的场景。

2024-01-06 13:07:28 705

原创 C++,智能指针详解(面试)

智能指针的使用可以帮助我们更方便地管理动态分配的内存资源,避免了手动释放内存的繁琐工作,减少了内存泄漏和悬空指针的风险。C++中的智能指针是一种用于管理动态分配的内存资源的指针类模板。它们提供了自动内存管理,帮助避免内存泄漏和悬空指针的问题,同时减少了手动释放内存的负担。根据具体的需求和场景,选择适当的智能指针可以提高代码的性能和可维护性。会增加对象的引用计数,导致对象在容器中的生命周期得不到正确管理,从而可能导致内存泄漏。这样,在引用计数归零时,对象会被正确释放,避免内存泄漏。,以解除循环引用关系。

2024-01-06 12:53:38 1245

原创 Qt的三大机制(面试)

这些核心机制共同构成了Qt框架的基础,使开发者能够更加方便、高效地开发跨平台的应用程序。Qt三大核心机制是信号与槽机制、事件机制和对象模型。

2024-01-03 11:25:52 904

原创 位运算总结

当我们需要在二进制级别上进行操作时,位运算非常有用。C++提供了几种位运算操作符,包括按位与(&)、按位或(|)、按位异或(^)、按位取反(~)和左移(<<)和右移(>>)。这些是位运算的基本使用示例。请注意,位运算通常在处理底层数据表示和优化代码时使用,对于一般的应用程序开发可能不常用。

2024-01-03 10:57:44 302

原创 类外访问类内私有虚函数的方法

使用友元函数:可以将一个函数声明为类的友元函数,从而使其能够访问类的私有成员和私有虚函数。在友元函数中,可以直接调用类的私有虚函数。请注意,这些方法都是通过间接访问来实现对私有虚函数的调用,以维护类的封装性和数据安全性。在C++中,类的私有成员和私有虚函数是不能直接从类外访问的。这是因为私有成员和私有虚函数被设计为仅供类内部使用,以提供封装性和数据安全性。使用公有接口函数:可以在类中定义公有函数,来间接实现对私有虚函数的访问。这些公有函数可以调用私有虚函数,然后在类外部调用公有函数即可。

2024-01-03 10:56:07 400

原创 C++中,左值引用和右值引用的区别

在上面的示例中,左值引用主要用于引用可取地址的表达式(如变量),而右值引用主要用于引用临时值和不可取地址的表达式。左值引用(lvalue reference)和右值引用(rvalue reference)是引用的两种类型。请注意,C++11引入了右值引用,并且在C++11之前的版本中,只有左值引用是可用的。当谈到左值引用和右值引用的区别时,以下是一些示例代码来说明它们之间的差异。只能引用左值(可以取地址的表达式,如变量、函数返回的左值等)这些示例旨在帮助理解左值引用和右值引用的概念和用法。

2024-01-02 21:00:21 374

原创 MFC或QT中,自绘控件的目的和实现步骤

自绘控件的目的是为了能够自定义控件的外观、行为和交互方式,以满足特定的需求,同时增强应用程序的用户体验。在QT中,自绘控件的目的是为了能够自定义控件的外观和行为,以满足特定的需求,并增强应用程序的用户体验。5、可以监听控件的鼠标事件(如鼠标移动、点击等),根据需要改变控件的状态以及绘制方式。4、可以根据控件的状态(如鼠标悬停、按下等)选择合适的绘制方式,以改变控件的外观。4、可以根据控件的状态(如鼠标悬停、按下等)选择合适的绘制方式,以改变控件的外观。6、可以添加自定义属性,以控制控件的行为和交互方式。

2023-12-25 19:48:07 888 2

原创 QT中,socket通讯要考虑哪些问题?(面试题)

在Qt中进行Socket通信时,需要考虑以下几个问题:连接建立和断开:确保在客户端和服务器端之间能够正确地建立和断开连接,以便进行正常的数据传输。数据传输格式:确定数据传输的格式,包括数据的编码方式、数据包的大小、传输协议等。根据需求选择合适的传输协议,如TCP或UDP,以及合适的数据编码方式,如JSON或XML。数据完整性和可靠性:确保数据的完整性和可靠性,避免数据丢失或损坏。可以通过使用TCP协议来确保数据的可靠性,或者使用校验和等机制来验证数据的完整性。

2023-12-25 19:35:48 769

原创 C++中,四种数据类型转换

这些示例展示了每种类型转换的基本用法。请注意,reinterpret_cast 的使用需要格外小心,因为它执行了一种低级别的类型 reinterpretation,可能会导致未定义行为或系统相关的问题。在实际编程中,应保持谨慎,根据实际需要选择合适的类型转换方式。在 C++ 中,有四种类型转换方式,分别是 static_cast、dynamic_cast、const_cast 和 reinterpret_cast。

2023-12-20 21:59:47 391

原创 QT添加新的组件

将源改为国内清华的路径,下载速度较快。将该tool软件拖到终端页面。1、找到QT安装的tool。2、找到其所在的文件夹位置。

2023-12-19 08:48:33 1016

原创 设计模式:观察者模式

在这个情况下,电视剧就是“主题”或“发布者”,而你就是一个“观察者”或“订阅者”。每当主题的状态发生变化时,所有的观察者都会得到通知,并且可以据此进行适当的反应。对象(或部件)可以发出信号(当特定事件发生时),其他对象可以监听(或订阅)这个信号,然后定义槽函数(或回调函数)来响应这个信号,从而实现彼此的解耦合。在此例中,NewsPublisher是"主题",NewsSubscriber是"观察者"。观察者模式就像一个新闻订阅服务。在这个例子中,新闻网站是"发布者"或"主题",而你是"订阅者"或"观察者"。

2023-11-27 09:35:02 319

原创 VS中如何使用Halcon

使用Halcon的本质就是调用Halcon的库,其主要步骤有:1、将Halcon代码导出为C++的.cpp文件2、获取.cpp文件中的action函数的函数体3、添加Halcon的动态库和静态库4、添加action函数需要的头文件。

2023-11-25 17:53:27 318

原创 lambda表达式基础

在这个示例中,我们定义了一个Lambda表达式 sum,它捕获了外部作用域中的变量 a 和 b,并返回它们的和。Lambda表达式的灵活性和简洁性使得它成为C++中一个非常有用的特性,特别是在需要传递函数作为参数或在需要定义小型函数时。在C++中,Lambda表达式是一种用于定义匿名函数的特性,它允许你在需要函数的地方直接定义函数,而无需显式声明一个命名函数。parameter list 是Lambda函数的参数列表,类似于普通函数的参数列表。{} 内是Lambda函数的函数体,包含了函数的具体逻辑。

2023-11-22 10:47:12 50

原创 Linux中,GDB调试的常用命令

例如,如果你有一个名为 test 的程序,你可以输入 gdb test 来启动 GDB 并加载 test 程序。例如,你可以输入 watch i 来监视变量 i 的值,当其值发生改变时,程序将会暂停执行。例如,如果你想查看函数调用堆栈,你可以输入 backtrace 或 bt。例如,如果你想将变量 i 的值设为 10,你可以输入 set var i=10。next 或 n:执行下一行代码。例如,如果你想执行下一行代码,你可以输入 next 或 n。例如,如果你想退出 GDB,你可以输入 quit 或 q。

2023-11-16 16:23:50 66

原创 VS打开Qt Designer(UI文件.ui)失败的解决方法

VS打开Qt Designer失败的根本原因:VS中默认的Qt Designer路径是错误的。所以要正常使用需要重新设置。1、设置VS中打开Designer的路径。

2023-11-14 20:34:47 1212

原创 QT的软件国际化(使用VS)

c)添加完成,添加完成后会自动生成.pm文件。前提:对程序中需要翻译的字符进行tr包裹。2、第二点 对当前显示的语音记录并设置。1、第一点 添加文件(翻译文件)b)通过语言家的文件,打开翻译文件。c)翻译后保存,最后发布。

2023-11-07 10:18:36 178

原创 MFC中,定时器的使用

当使用SetTimer函数创建一个定时器并启动后,当定时器触发时,系统会发送WM_TIMER消息给窗口,然后MFC框架会调用该窗口类的OnTimer函数来处理这个消息。在OnTimer函数中,可以根据nIDEvent参数的值来判断是哪个定时器触发了,然后执行相应的操作。在调用SetTimer函数后,系统将会在指定的间隔时间过后,触发一个定时器事件,并调用指定的回调函数。lpTimerFunc:是一个定时器回调函数的指针,用于在定时器触发时执行特定的操作。可以是一个回调函数的地址,也可以是一个函数指针。

2023-10-10 21:48:33 815

原创 雷赛运动卡的两种输出方式的简单介绍

无论是单路脉冲输出还是双路脉冲输出,它们都是用来告诉电机要移动到哪个位置。具体的位置指令可以通过软件或者其他输入设备发送给 DMC1000/DMC1000B 运动控制卡,然后控制卡将相应的脉冲信号发送给电机,从而实现准确的位置控制。一个脉冲信号用来控制电机的顺时针(CW)运动,另一个脉冲信号用来控制电机的逆时针(CCW)运动。第一种方式是单路脉冲(脉冲+方向)输出。在这种方式下,位置指令通过一个脉冲信号和一个方向信号传输。脉冲信号用来控制电机的步进或运动距离,方向信号用来指示电机是正向运动还是反向运动。

2023-10-10 10:04:12 330

原创 VS设置输入静态库

a)添加静态库所在的文件夹。常规——》添加库目录。输入——》附加依赖项。

2023-10-10 10:01:21 43

原创 MFC中,创建空项目改为MFC项目的基本设置

a)添加静态库所在的文件夹。常规——》添加库目录。输入——》附加依赖项。2、链接器——>子系统。

2023-10-09 21:16:08 59

原创 QT引入图片资源

7、选择需要的照片,注意这里放图片的文件夹最好在项目文件夹内。3、选择QT --> Qt Resource File;2、右键项目,点击add new。4、自己取个名字,路径不用改。5、点击ADD prefix。8、点击右上角x,并确认保存。6、点击add files。1、将图片放入一个文件夹。

2023-10-06 20:08:10 1089

原创 QT中QTreeWidget的使用

1、创建QTreeWidget的对象。2、设置QTreeWidget的内容。

2023-10-06 10:13:34 202

原创 QT中,QTreeView的用法

1、创建QTreeView2、创建视图表头3、创建一级节点4、创建第二个一级节点5、创建第一个一级节点的二级节点6、 将标准视图添加到树形视图的模型中。

2023-10-05 17:21:04 591

原创 QT中的对象自动释放机制

我们都知道在C++中,使用new和delete是需要成对存在的,否则会导致内存泄漏。但是,在QT中,有时候我们通过new关键字创建的对象,并不需要手动调用delete来释放内存,因为QT提供了自动释放机制。那么,究竟什么时候需要手动释放,什么时候可以交给QT自动释放呢?

2023-10-01 20:23:10 706

原创 QMainWindow窗口添加布局失败的原因及修改方法

接下来,我们创建一个 QVBoxLayout 布局对象 layout,并将其设置为 centralWidget 的布局。在Qt中,QMainWindow是一个特殊的窗口类,它预定义了一个布局,称为中央部件(central widget)。因此,直接为QMainWindow添加布局是无效的。如果你想在QMainWindow中添加其他布局,你需要首先创建一个QWidget对象,并将其设置为中央部件。这样,当我们运行这个代码时,会在QMainWindow中显示两个按钮,这两个按钮位于窗口的中央部件中。

2023-09-28 09:46:18 267

原创 C++的动态库的封装步骤详解

三、重新编译,然后将dll文件和lib文件放到要调用该模块的程序的执行文件的目录中,即可调用该动态库。四、调用动态库分为隐形调用和显性调用。这里主要介绍隐形调用。二、将代码封装,注意代码中预处理的定义要一致。方法二:在属性的链接器中编辑依赖项。一、在VS编译器中创建DLL工程。方法一:使用pragma语句。

2023-09-14 22:30:19 408

原创 GDI中,动画闪烁的原因及解决方案

下面的代码中,我把所有要输出的动画都放到了m_dc中,最后绘制完整的m_dc。每一帧都是m_dc动画,就不存在动画交替输出的问题了。所谓双缓冲就是将每一帧要显示的动画,都放到一个内存DC里,每一帧都是一张动画。这样就避免了动画元素交替输出的问题。动画闪烁的根本原因是动画背景和动画元素的交替输出。解决方案是使用双缓冲技术。

2023-09-14 21:59:20 197

原创 GDI中,位图的拉伸和复制的函数StretchBlt

在上述示例代码中,首先通过LoadBitmap函数加载了一个位图资源,并创建了一个CBitmap对象。然后,通过设定目标的宽度和高度,使用StretchBlt函数将位图从内存设备上下文复制到设备上下文中,并进行拉伸操作。最后,通过SelectObject函数将原来的位图对象选回内存设备上下文,并完成绘制操作。StretchBlt函数是GDI中用于在设备上下文之间进行位图的拉伸和复制的函数。注意,在实际使用时,需要根据实际情况设置目标的宽度和高度,并且需要根据位图的宽度和高度来调整拉伸的参数。

2023-09-11 20:03:12 130

原创 GDI中,CRgn类的混合函数

CombineRgn函数可以用于将两个区域进行混合操作,生成一个新的区域。RGN_COPY 拷贝。RGN_AND 交集。RGN_XOR 异或。RGN_DIFF 不同。RGN_OR 并集。

2023-09-11 19:18:26 76

原创 GDI绘图的基本步骤

1、创建设备上下文(Device Context):使用CreateDC、GetDC或者BeginPaint函数创建设备上下文,它是GDI绘图的主要操作对象。2、创建画笔和画刷(Pen和Brush):使用CreatePen和CreateBrush等函数创建画笔和画刷对象,用于指定绘图的线条和填充样式。4、绘制图形:使用设备上下文的绘图函数,如LineTo、Rectangle、Ellipse等函数进行绘图操作。5、删除画笔和画刷:使用DeleteObject函数删除创建的画笔和画刷对象。

2023-09-11 17:43:16 437

空空如也

空空如也

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

TA关注的人

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