- 博客(108)
- 收藏
- 关注
原创 线性代数之向量、矩阵求导公式
本文系统梳理了矩阵求导的基本概念与运算规则。主要内容包括:1)两种布局约定(分子布局和分母布局)及其维度关系;2)不同变量组合的求导定义(标量对向量/矩阵、向量对标量/矩阵等);3)核心运算法则(线性法则和乘积法则)。重点阐述了向量对向量求导的两种布局形式及其转换关系,并给出了标量对矩阵求导的具体示例。文中通过表格和公式清晰地展示了各类求导结果的维度关系,为矩阵微积分运算提供了系统的参考框架。
2025-08-01 07:30:00
341
原创 通过MATLAB符号计算推导透视逆变换
本文系统介绍了透视变换及其逆变换的推导过程。透视变换是一种将图像从一个视角投影到另一个视角的3×3矩阵变换,可以将矩形映射为任意四边形,广泛应用于图像校正和视角变换。文章详细阐述了透视变换的数学原理和参数含义,重点推导了透视逆变换的解析解,通过MATLAB符号计算和克莱姆法则两种方法得到一致结果。验证表明,两种推导方式虽然表达式不同但均正确有效。透视逆变换在计算机视觉中具有重要应用价值,如反投影和去畸变等场景,其适用条件是变换矩阵行列式不为零。
2025-07-28 07:30:00
1508
原创 如何使用MATLAB内置函数solve进行符号计算(求解方程)
本文介绍了MATLAB中符号计算(solve)和数值求解(fsolve)两种方法的区别与应用。符号计算基于数学定理推导,可得到解析解,适用于代数方程和微分方程求解;数值计算则通过离散化处理获得近似解,适用于复杂非线性方程组。文中通过具体示例展示了两种方法的实现步骤,包括单变量方程、多变量方程组以及微分方程的求解过程,并对比了二者的计算精度与适用场景,为工程计算和理论研究提供了实用参考。
2025-07-26 07:45:00
595
原创 矩阵分解技术全面综述:原理、算法与应用
本文系统介绍了矩阵分解的核心方法,主要包括LU分解、LDLT分解及其应用。LU分解将方阵分解为单位下三角矩阵L和上三角矩阵U的乘积,适用于主元非零的方阵,可用于线性方程组求解和矩阵求逆。LDLT分解是LU分解的对称形式,将对称矩阵分解为LDL^T形式,适用于对称正定矩阵,在优化问题和数值分析中有重要应用。文章详细阐述了各分解方法的数学原理、算法实现步骤(附MATLAB/Python代码)和典型计算示例,为矩阵计算提供了系统的理论基础和实用工具。
2025-07-21 07:15:00
715
原创 图像压缩技术总结(SVD,下采样,DCT,霍夫曼编码)
图像压缩技术分为无损和有损两大类。无损压缩(如霍夫曼编码、LZW)保留原始数据,适合文档和医学图像;有损压缩(如JPEG、WebP)通过DCT变换、量化等技术大幅减少数据量,适用于照片和网络图像。核心方法包括空间域压缩(下采样、预测编码)、变换域压缩(DCT、小波变换)和熵编码(霍夫曼、算术编码)。现代技术如深度学习和SVD提供更高压缩比。JPEG等标准流程结合变换、量化和熵编码实现高效压缩。未来趋势是深度学习与感知优化的结合,不同场景需权衡压缩率、质量和计算复杂度。
2025-07-17 07:30:00
1606
原创 使用MATLAB对符号函数进行求导、积分、求极限
本文介绍了MATLAB符号数学工具箱在函数解析计算中的应用,主要包括符号求导、积分和极限运算。通过diff()函数可实现一阶、高阶导数及偏导数的精确计算;int()函数支持不定积分、定积分及反常积分的求解;limit()函数可计算函数在特定点的极限值,包括左右极限和无穷极限。文章还对比了符号计算与数值计算的差异,并展示了使用subs()函数对符号表达式进行赋值运算的方法。这些功能为数学分析和工程应用提供了强大的解析计算工具,相比数值近似能获得更精确的结果。
2025-07-17 07:30:00
698
原创 SVD、DCT图像压缩实践
摘要:本文介绍了两种图像压缩方法:SVD(奇异值分解)和DCT(离散余弦变换)。SVD通过分解图像矩阵为U、Σ、V三个矩阵,保留前k个奇异值实现压缩,压缩率与图像质量需权衡;实验显示k=50时压缩率为25.70%。DCT则将图像转换到频域,舍弃高频系数(右下角区域)以压缩数据,类似JPEG流程。两种方法均通过MATLAB实现,并对比了不同参数下的压缩效果,SVD直接控制奇异值数量,DCT则通过掩模矩阵选择性保留低频成分。结果表明,两种方法都能有效压缩图像,但压缩率提升会导致质量下降。
2025-07-14 21:58:26
372
原创 LZ4图像压缩实践(大文件数据压缩)
本文介绍了LZ4无损压缩算法的原理及其实现。LZ4基于LZ77算法,通过滑动窗口查找重复数据并用(距离,长度)引用替代,实现高效压缩。其优势在于高速压缩/解压、低CPU占用和可调压缩率。文章详细解析了LZ4的数据格式、压缩流程(扫描+匹配)和解压过程,并提供了C++封装类LZ4ImageProcessor的实现代码,支持RAW数据的压缩和解压功能。该实现通过LZ4官方开源库,在压缩数据前会存储图像宽高信息,解压时进行校验确保数据完整性。
2025-07-14 07:30:00
807
原创 基于霍夫曼(Huffman)编码的图像压缩
摘要 霍夫曼编码是一种基于概率的无损数据压缩算法,通过为高频符号分配短码、低频符号分配长码来构建最优前缀码。本文详细阐述了霍夫曼编码原理,包括构建Huffman树、生成编码表的过程,并以"EABCBAEDBCEEEDCEBABC"为例展示了具体实现步骤。文章还介绍了霍夫曼编解码算法在图像处理中的应用流程,包括树构建、序列化、数据压缩和文件格式规范。最后提供了C++实现的RAW图像压缩代码框架,涵盖频率统计、树构建、编码生成和序列化等关键步骤。该算法能有效减少数据冗余,满足信息熵理论的最小
2025-07-11 07:30:00
796
原创 无约束优化之单纯形法(Nelder-Mead Algorithm)
摘要: 无约束单纯形法(Nelder-Mead方法)是一种无需导数的直接搜索优化算法,适用于求解非线性优化问题。通过维护n维空间的单纯形(n+1个顶点),动态执行反射、扩张、收缩等几何操作调整搜索方向,逐步逼近最优解。其核心优势在于适应非光滑、黑箱函数等复杂场景,但无法保证全局最优性。算法参数包括反射系数(ρ=1)、扩张系数(γ=2)、收缩系数(α=0.5)等,通过迭代更新单纯形结构实现目标函数的最小化。
2025-06-23 07:30:00
590
原创 CUDA编程入门之错误检查
本文介绍了CUDA运行时API的常见错误类型(cudaError_t)及其检测方法,包括cudaSuccess、cudaErrorInvalidValue等常见错误码。文章提供了两种错误检测函数(cudaGetErrorName/GetErrorString)的使用方法,并展示了封装好的错误检查宏CUDA_CHECK和LAST_KERNEL_CHECK的实现代码。此外,还包含了日志打印和设备信息输出的实用函数示例,通过变参实现格式化日志输出,并详细展示了获取GPU设备属性的方法。最后附上了CUDA编程相关参
2025-06-20 21:00:10
889
原创 Python实现图片格式批量转换(支持HEIC)
图像批量转换工具摘要 本文介绍了两种基于Python的批量图像格式转换方案:1)常规图像格式转换,使用Pillow库支持JPG/PNG/BMP等常见格式互转;2)HEIC特殊格式转换,需配合pillow_heif插件处理。两种方案均支持:批量处理文件夹(保留子目录结构)、异常文件自动跳过、输出质量优化。对于HEIC格式的EXIF数据过长问题,提供了清除元数据的解决方案。文章还给出了多线程加速版本,并详细说明使用方法(需安装Pillow和pillow_heif依赖),适用于婚礼照片等大批量图像格式转换场景。
2025-06-18 07:30:00
502
原创 向量/矩阵的范数、谱半径和条件数
本文介绍了向量和矩阵的常见范数定义及计算方法。向量的范数包括L1范数(绝对值之和)、L2范数(欧几里得距离)和无穷范数(最大绝对值);矩阵范数涵盖1范数(最大列和)、2范数(最大奇异值)、无穷范数(最大行和)和Frobenius范数(元素平方和的平方根)。此外还介绍了谱半径(特征值绝对值的最大值)和条件数(衡量矩阵稳定性的指标)。文中给出了各种范数的数学定义、计算示例和对应的MATLAB实现代码,便于实际应用参考。这些概念在线性代数、数值计算等领域具有重要作用。
2025-05-26 07:30:00
958
原创 C++实时统计数据均值、方差和标准差
采用Welford 算法:避免传统方法(如先计算总和再求均值)的浮点数精度损失,保证了数值稳定性。处理边界条件:当数据量(n < 2)时,方差返回0.0。本文算法的优势:内存效率高,仅需要维护3个成员变量,适合实时或大数据场景。对比传统算法:避免存储全部数据,计算复杂度O(1)。
2025-04-28 21:37:30
922
原创 衡量矩阵数值稳定性的关键指标:矩阵的条件数
矩阵的条件数衡量矩阵对扰动或误差的敏感性。对于非奇异矩阵A∈Rn×nA∈Rn×nCondA∥A∥⋅∥A−1∥CondA∥A∥⋅∥A−1∥其中∥⋅∥∥⋅∥为矩阵范数。2-范数(谱条件数)Cond2AσmaxσminCond2Aσminσmaxσmaxσmax和σminσmin分别为最大和最小奇异值。1-范数和∞-范数。
2025-04-27 23:05:53
1388
原创 TensorRT入门:ONNX转换为TensorRT引擎文件
trtexec 工具是 TensorRT 的命令行工具,位于 TensorRT 的安装目录中,随 TensorRT 的安装就可以直接使用。trtexec,不仅打包了几乎所有 TensorRT 脚本可以完成的工作,并且扩展丰富的推理性能测试的功能。通常我们使用 trtexec 完成下面三个方面的工作,一是由 Onnx 模型文件生成 TensorRT 推理引擎,并且可以序列化为 .plan 文件。二是可以查看 Onnx 或者 .plan 文件的网络的逐层信息。
2025-04-27 07:30:00
1670
原创 pytorch手动调整学习率
在此,将进行拓展,学习如何手动更新学习率(即不使用pytorch自带的学习率调度器)。当我们在使用预训练的模型时,需要对分类层进行单独修改并进行初始化,其他层的参数采用预训练的模型参数进行初始化,这个时候我们希望在进行训练过程中,除分类层以外的层只进行微调,不需要过多改变参数,因此需要设置较小的学习率。总而言之,通过引入学习率衰减,在模型训练初期,会使用较大的学习率进行模型优化,随着迭代次数增加,模型逐渐收敛,学习率会逐渐进行减小,保证模型在训练后期不会有太大的波动,从而更加接近最优解。
2025-04-22 07:30:00
1114
原创 C++(OpenCV)实现MATLAB的edge(I, “sobel“)边缘检测
函数的C++代码,我们需要复现其完整的边缘检测流程,包括梯度计算、非极大值抑制和阈值处理。此代码实现了类似MATLAB的Sobel边缘检测流程,结合非极大值抑制和自动阈值处理,能够有效提取图像边缘。为了实现类似于MATLAB的。
2025-04-17 20:54:46
503
原创 C++动态链接库的创建及使用
运行时加载:程序运行时动态加载,节省内存。独立更新:更新库无需重新编译主程序。可重用性:由于多个应用程序可以共享一个DLL,因此它们可以共享相同的代码和数据,从而提高了代码的可重用性。节省内存:由于DLL在运行时才加载到内存中,因此它们可以在不占用过多内存的情况下提供所需的功能。稳定性:由于多个应用程序共享相同的DLL,因此如果DLL中的代码或数据发生问题,则可以在一次更新后修复所有使用该DLL的应用程序。
2025-04-17 08:00:00
1828
原创 C#调用C++动态库时出现`System.DllNotFoundException`错误的解决思路
确认DLL位置:将DLL放在C#输出目录。检查依赖项:确保所有依赖的DLL存在。缺少目标XXXdll的依赖,例如要用到的是A.dll,A.dll用到时需要添加B.dll动态库文件,在用到时需要两个dll同时存在。其中,B.dll导出有问题时通过dumpbin检查A.dll不能检查出来,需要进一步检查B.dll。匹配平台:统一x86或x64。验证导出函数:使用dumpbin检查名称。安装VC++运行时:确保目标机器已安装。通过逐步排查上述问题,通常可以解决。
2025-04-07 21:02:43
1382
原创 Dumpbin 完全指南:深入解析所有命令与实战技巧
Dumpbin 是 Microsoft Visual Studio 提供的 COFF/PE 二进制文件分析工具,可以深入分析 EXE、DLL、OBJ、LIB 等文件格式的内部结构。它是逆向工程、性能优化和调试的强大助手。显示文件简要统计信息。
2025-04-07 08:00:00
2404
原创 使用dumpbin和depends查看dll(exe)的依赖
dumpbin只能查看一级依赖,如果需要一次查看所有依赖则需要使用Dependency Walker。Dependency Walker 可以自定义搜索目录,合理设置搜索目录,会大大提高搜索速度!默认情况下,Dependency Walker 会搜索 PATH 指定的路径,所以也可以通过修改 PATH 环境变量的值达到相同的效果。如果长时间(大概 5 秒钟)没有处理界面消息的话,界面就会无响应。VS2017 程序在新电脑环境出现 “无法加载DLL “xxxx.dll“:找不到指定模块。
2025-03-29 20:31:51
1805
原创 线性代数之矩阵特征值与特征向量的数值求解方法
特征方程与求解方法根据定义A−λIu0A−λIu0若A−λIA−λI非奇异,则方程只有零解。detA−λI0。
2025-03-08 17:11:42
3539
原创 MATLAB实现最小二乘法拟合直线
最小二乘法拟合直线的核心思想是:给定一组数据点xiyi(x_i, y_i)xiyi,其中i=1, 2, …, N,我们希望找到一条直线y = kx + b,使得这些点到直线的垂直距离的平方和最小。这里的k是直线的斜率,b是直线的截距。
2025-03-03 08:00:00
1658
原创 最小二乘法拟合直线(平面和空间)
最小二乘法(英文:least square method)是一种常用的数学优化方法,所谓二乘就是平方的意思。这平方一词指的是在拟合一个函数的时候,通过最小化误差的平方来确定最佳的匹配函数,所以最小二乘、最小平方指的就是拟合的误差平方达到最小。通过上面的式子不难发现,实际计算时,我们只需要计算出t1, t2, t3, t4即可进一步计算a,b。若存在噪声,拟合直线则为最小二乘最优解。求多元函数的极值点,我们可以令其各个偏导数等于0,然后解方程即可。通过解方程进一步得到y=ax+b的参数a和b。
2025-02-23 19:56:56
1149
原创 三维空间中直线的多种表示方法
无论是二维还是三维空间的直线方程,它们都是用来描述满足特定条件的所有点的集合,即直线的轨迹。虽然两者都描述直线,但二维空间直线方程更多地与平面几何相关,表示平面内满足某一条件的所有点的集合。而三维空间直线方程则与立体几何相关,表示空间中满足某一条件的所有点的轨迹,具有更复杂的几何意义。而在三维空间中,由于坐标轴的增多,其表示形式也更多,其中参数方程形式更为常用和直观。这些方法在不同场景下各有优势,参数方程便于生成点,对称式直观,交面式适合代数分析,而Plücker坐标适用于几何计算。
2025-02-23 19:31:59
2954
原创 3D空间中的旋转:欧拉角,旋转矩阵,四元数,旋转向量
一般用一个齐次矩阵表示位姿,即同时表示旋转和平移。MATLAB中的转换函数% 已知按顺序绕n系下x,y,z轴旋转对应角度后得到b系% 即描述物体在n系下的姿态角(角标描述先下后上)% 欧拉角→方向余弦% 欧拉角→四元数% 方向余弦→欧拉角% 方向余弦→四元数% 四元数→方向余弦% 四元数→欧拉角。
2025-02-21 16:13:44
1584
原创 2024年度总结:做一个持续精进的人
这一年过得很快,但只写了38篇博客,对自己并不是很满意,但很庆幸竟然获得了博客之星的评选资格。这入围的条件是什么,我是没有看过的。在此,我也仅仅将个人的想法写了下来,若有不适的地方,敬请大家批评指正。在下一年,将继续不断创作。
2025-01-23 22:58:21
763
原创 C++设计模式学习
设计模式是一种经验总结,它描述了在特定环境中经常出现的问题,并提供了问题解决方案的模板。设计模式就像是一套编程阵法,让你在编程世界中更加游刃有余,掌握了这些阵法,你的代码将更加健壮,逻辑清晰,方便维护。通过学习设计模式,你可以实现代码组件间的高度解耦和协同,让你的应用变得更加稳定和可扩展。使用工厂模式,你可以将对象的创建过程与具体类解耦,让代码更加灵活;使用策略模式,你可以根据不同情境灵活切换算法;使用单例模式,确保一个类只有一个实例,并提供全局访问点;
2024-12-16 16:51:52
1328
原创 UML类图学习
UML类图是UML中最常用的图之一,主要用于描述系统中的类、接口、协作和它们之间的关系,如继承、聚合、组合、依赖和实现。它以反映类的结构(属性、操作)以及类之间的关系为主要目的,描述了软件系统的结构,是一种静态建模方法。类图用来描述系统中有意义的概念,包括具体的概念、抽象的概念、实现方面的概念等,是对现实世界中事物的抽象。类图不仅帮助我们理解系统的静态结构,还能够辅助设计阶段的工作。它们提供了对系统组件的高层次视图,有助于识别系统的关键概念,并促进团队成员之间的交流。
2024-12-12 22:43:39
1310
原创 (C++)堆已损坏CRT detected that the application wrote to memory after end of heap buffer
在使用内存之前,务必一定要确定内存已经分配了,且不要越界,否则会出现此类错误。另外,在调试程序时,最好先在debug模式下跑通,然后再在release下运行,这样也容易排查一些潜在的错误。这篇文章应该就是一个越界使用的例子,本质上也是使用了自己未分配的内存。
2024-12-10 07:30:00
619
原创 pycharm或conda中配置镜像源
由于Python在下载包时,容易出现超时等问题,主要是因为Python库的服务器都在国外,国内下载库的速度会很慢,所以需要配置国内镜像源来加快下载速度。打开pycharm,File – Settings – Project-- Project Interpreter。配置镜像源有两种方式这里以清华镜像源举例,具体用哪个可根据实际情况。然后点击“+”添加镜像源地址(建议先把本地镜像源删除)然后点击“Manage Repositories”也可以通过打开文件来增加删除镜像源。
2024-12-01 14:58:57
3110
原创 深度学习之pth转换为onnx时修改模型定义
在将PyTorch模型(.pth文件)转换为ONNX格式时,通常的转换过程是通过torch.onnx.export函数来实现的。这个过程主要是将PyTorch模型的计算图导出为ONNX格式,以便在其他框架或环境中使用。在转换过程中,你通常不能直接在原有的PyTorch模型前后“添加函数”,因为ONNX导出的是静态计算图,它表示的是模型在某一时刻的结构和参数,而不是动态的执行过程。不过,你可以通过修改模型定义的方式来实现类似的功能。
2024-12-01 13:12:25
775
原创 【python, C++, CUDA】双线性插值(Bilinear Interpolation)实现
双线性插值是一种更为平滑的图像缩放算法,它考虑了目标像素周围四个源像素的影响,并根据距离进行加权。其主要经过三次线性插值得到,如下为线性插值的公式,可以将插值点的值解释为两个点的距离加权,其中距离近的点权重大,距离远的点权重小。已知Q11(x1,y1)、Q12(x1,y2)、Q21(x2,y1)、Q22(x2,y2),求其中点P(x,y)的值。不难发现,其中每个点的权重和对角点到点P的距离是相关的(水平距离x垂直距离)。当然,也可以简化为如下的加权公式,可以看到该点由四个点加权求和得到。
2024-11-28 23:59:57
1399
原创 PyCharm 中Debug时如何在断点处编写测试代码
综上所述,虽然 PyCharm 没有一个特定的插件能在断点下直接执行全新代码,但其内置的调试控制台和 “Evaluate Expression” 功能已经提供了相当强大的交互式调试能力。在调试模式下,PyCharm 提供了一个交互式的调试控制台(Debug Console),你可以在这里执行任意的 Python 代码。这是最直接的方法,在断点处检查和修改变量的状态,或者执行新的代码片段。在 PyCharm 中,你可以使用一些内置功能和插件来增强调试体验,包括在断点处编写和执行新的测试代码。
2024-11-24 21:23:16
1112
原创 最优化之各种牛顿法
牛顿法可以用于求解非线性方程的根(零点),也可以用于求函数的极值点。当问题是求非线性方程的根时,f(x)=0;当问题是求函数的极值点时,f(x)'=0,也就是我们常见的最优化问题。本文主要基于最优化问题对牛顿法进行介绍。
2024-11-16 16:03:36
1903
原创 深度学习之pytorch常见的学习率绘制
在PyTorch中,可以通过torch.optim.lr_scheduler模块提供的多个学习率调度器(Learning Rate Scheduler)来实现学习率的动态调整。这些调度器可以帮助优化训练过程,提高模型的性能。
2024-11-11 07:00:00
1356
算法工程师-C++和数学基础知识
2023-04-12
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人