当前位置: 首页 > news >正文

MATLAB中fft函数用法

目录

语法

说明

示例

含噪信号

高斯脉冲

余弦波

正弦波的相位

FFT 的插值


        fft函数的功能是对数据进行快速傅里叶变换。

语法

Y = fft(X)
Y = fft(X,n)
Y = fft(X,n,dim)

说明

​Y = fft(X) 用快速傅里叶变换 (FFT) 算法计算 X 的离散傅里叶变换 (DFT)。

  • 如果 X 是向量,则 fft(X) 返回该向量的傅里叶变换。

  • 如果 X 是矩阵,则 fft(X) 将 X 的各列视为向量,并返回每列的傅里叶变换。

  • 如果 X 是一个多维数组,则 fft(X) 将沿大小不等于 1 的第一个数组维度的值视为向量,并返回每个向量的傅里叶变换。

Y = fft(X,n) 返回 n 点 DFT。如果未指定任何值,则 Y 的大小与 X 相同。

  • 如果 X 是向量且 X 的长度小于 n,则为 X 补上尾零以达到长度 n。

  • 如果 X 是向量且 X 的长度大于 n,则对 X 进行截断以达到长度 n。

  • 如果 X 是矩阵,则每列的处理与在向量情况下相同。

  • 如果 X 为多维数组,则大小不等于 1 的第一个数组维度的处理与在向量情况下相同。

Y = fft(X,n,dim) 返回沿维度 dim 的傅里叶变换。例如,如果 X 是矩阵,则 fft(X,n,2) 返回每行的 n 点傅里叶变换。

示例

含噪信号

        使用傅里叶变换求噪声中隐藏的信号的频率分量。

        指定信号的参数,采样频率为 1 kHz,信号持续时间为 1.5 秒。

Fs = 1000;            % Sampling frequency                    
T = 1/Fs;             % Sampling period       
L = 1500;             % Length of signal
t = (0:L-1)*T;        % Time vector

        构造一个信号,其中包含幅值为 0.7 的 50 Hz 正弦量和幅值为 1 的 120 Hz 正弦量。

S = 0.7*sin(2*pi*50*t) + sin(2*pi*120*t);

        用均值为零、方差为 4 的白噪声扰乱该信号。

X = S + 2*randn(size(t));

        在时域中绘制含噪信号。通过查看信号 X(t) 很难确定频率分量。

plot(1000*t(1:50),X(1:50))
title("Signal Corrupted with Zero-Mean Random Noise")
xlabel("t (milliseconds)")
ylabel("X(t)")

如图所示:

        计算信号的傅里叶变换。

Y = fft(X);

        计算双侧频谱 P2。然后基于 P2 和偶数信号长度 L 计算单侧频谱 P1。

P2 = abs(Y/L);
P1 = P2(1:L/2+1);
P1(2:end-1) = 2*P1(2:end-1);

        定义频域 f 并绘制单侧幅值频谱 P1。与预期相符,由于增加了噪声,幅值并不精确等于 0.7 和 1。一般情况下,较长的信号会产生更好的频率逼近值。

f = Fs*(0:(L/2))/L;
plot(f,P1) 
title("Single-Sided Amplitude Spectrum of X(t)")
xlabel("f (Hz)")
ylabel("|P1(f)|")

如图所示:

        现在,采用原始的、未破坏信号的傅里叶变换并检索精确幅值 0.7 和 1.0。

Y = fft(S);
P2 = abs(Y/L);
P1 = P2(1:L/2+1);
P1(2:end-1) = 2*P1(2:end-1);plot(f,P1) 
title("Single-Sided Amplitude Spectrum of S(t)")
xlabel("f (Hz)")
ylabel("|P1(f)|")

如图所示:

高斯脉冲

        将高斯脉冲从时域转换为频域。

        指定信号的参数,采样频率为 44.1 kHz,信号持续时间为 1 秒。创建一倍标准差为 0.1 ms 的高斯脉冲。

Fs = 44100;         % Sampling frequency
T = 1/Fs;           % Sampling period
t = -0.5:T:0.5;     % Time vector
L = length(t);      % Signal lengthX = 1/(0.4*sqrt(2*pi))*(exp(-t.^2/(2*(0.1*1e-3)^2)));

在时域中绘制脉冲。

plot(t,X)
title("Gaussian Pulse in Time Domain")
xlabel("Time (t)")
ylabel("X(t)")
axis([-1e-3 1e-3 0 1.1]) 

如图所示:

        fft 的执行时间取决于变换的长度。仅具有小质因数的变换长度比那些具有大质因数的变换长度的执行时间要快得多。

        在此示例中,信号长度 L 是 44101,这是非常大的质数。为了改进 fft 的性能,从原始信号长度确定一个是下一个 2 次幂的输入长度。使用此输入长度调用 fft 会将具有尾随零的脉冲 X 填充到指定的变换长度。

n = 2^nextpow2(L);

        将高斯脉冲转换为频域。

Y = fft(X,n);

        定义频域并绘制唯一频率。

f = Fs*(0:(n/2))/n;
P = abs(Y/n).^2;plot(f,P(1:n/2+1)) 
title("Gaussian Pulse in Frequency Domain")
xlabel("f (Hz)")
ylabel("|P(f)|^2")

如图所示:

余弦波

        比较时域和频域中的余弦波。指定信号的参数,采样频率为 1 kHz,信号持续时间为 1 秒。

Fs = 1000;                    % Sampling frequency
T = 1/Fs;                     % Sampling period
L = 1000;                     % Length of signal
t = (0:L-1)*T;                % Time vector

        创建一个矩阵,其中每一行代表一个频率经过缩放的余弦波。结果X为 3×1000 矩阵。第一行的波频为 50,第二行的波频为 150,第三行的波频为 300。

x1 = cos(2*pi*50*t);          % First row wave
x2 = cos(2*pi*150*t);         % Second row wave
x3 = cos(2*pi*300*t);         % Third row waveX = [x1; x2; x3];

        在单个图窗中按顺序绘制X的每行的前 100 个项,并比较其频率。

for i = 1:3subplot(3,1,i)plot(t(1:100),X(i,1:100))title("Row " + num2str(i) + " in the Time Domain")
end

如图所示:

        指定 dim 参数沿 X 的行(即对每个信号)使用 fft。

dim = 2;

        计算信号的傅里叶变换。

Y = fft(X,L,dim);

        计算每个信号的双侧频谱和单侧频谱。

P2 = abs(Y/L);
P1 = P2(:,1:L/2+1);
P1(:,2:end-1) = 2*P1(:,2:end-1);

        在频域内,为单个图窗中的每一行绘制单侧幅值频谱。

for i=1:3subplot(3,1,i)plot(0:(Fs/L):(Fs/2-Fs/L),P1(i,1:L/2))title("Row " + num2str(i) + " in the Frequency Domain")
end

如图所示:

正弦波的相位

        创建一个由频率为 15 Hz 和 40 Hz 的两个正弦波组成的信号。第一个正弦波是相位为 −π/4 的余弦波,第二个正弦波是相位为 π/2 的余弦波。以 100 Hz 的频率对信号进行 1 秒钟的采样。

Fs = 100;
t = 0:1/Fs:1-1/Fs;
x = cos(2*pi*15*t - pi/4) + cos(2*pi*40*t + pi/2);

        计算信号的傅里叶变换。将变换幅值绘制为频率函数。

y = fft(x);
z = fftshift(y);ly = length(y);
f = (-ly/2:ly/2-1)/ly*Fs;
stem(f,abs(z))
title("Double-Sided Amplitude Spectrum of x(t)")
xlabel("Frequency (Hz)")
ylabel("|y|")
grid

如图所示:

        计算变换的相位,删除小幅值变换值。将相位绘制为频率函数。

tol = 1e-6;
z(abs(z) < tol) = 0;theta = angle(z);stem(f,theta/pi)
title("Phase Spectrum of x(t)")
xlabel("Frequency (Hz)")
ylabel("Phase/\pi")
grid

如图所示:

FFT 的插值

        通过填充零来对信号的傅里叶变换进行插值。

        指定信号的参数,采样频率为 80 Hz,信号持续时间为 0.8 秒。

Fs = 80;
T = 1/Fs;
L = 65;
t = (0:L-1)*T;

        创建一个 2 Hz 正弦信号及其高次谐波的叠加。该信号包含一个 2 Hz 余弦波、一个 4 Hz 余弦波和一个 6 Hz 正弦波。

X = 3*cos(2*pi*2*t) + 2*cos(2*pi*4*t) + sin(2*pi*6*t);

        在时域中绘制该信号。

plot(t,X)
title("Signal superposition in time domain")
xlabel("t (ms)")
ylabel("X(t)")

如图所示:

        计算信号的傅里叶变换。

Y = fft(X);

        计算信号的单侧幅值频谱。

f = Fs*(0:(L-1)/2)/L;
P2 = abs(Y/L);
P1 = P2(1:(L+1)/2);
P1(2:end) = 2*P1(2:end);

        在频域中绘制单侧频谱。由于信号的时间采样相当短,傅里叶变换的频率分辨率不够精确,不足以显示 4 Hz 附近的峰值频率。

plot(f,P1,"-o") 
title("Single-Sided Spectrum of Original Signal")
xlabel("f (Hz)")
ylabel("|P1(f)|")

如图所示:

        为了更好地评估峰值频率,您可以通过用零填充原始信号来增加分析窗的长度。这种方法以更精确的频率分辨率自动对信号的傅里叶变换进行插值。

        从原始信号长度确定是下一个 2 次幂的新输入长度。用尾随零填充信号 X 以扩展其长度。计算填零后的信号的傅里叶变换。

n = 2^nextpow2(L);
Y = fft(X,n);

        计算填零后的信号的单侧幅值频谱。由于信号长度 n 从 65 增加到 128,频率分辨率变为 Fs/n,即 0.625 Hz。

f = Fs*(0:(n/2))/n;
P2 = abs(Y/L);
P1 = P2(1:n/2+1);
P1(2:end-1) = 2*P1(2:end-1);

        绘制填零后的信号的单侧频谱。此新频谱在 0.625 Hz 的频率分辨率内显示 2 Hz、4 Hz 和 6 Hz 附近的峰值频率。

plot(f,P1,"-o") 
title("Single-Sided Spectrum of Padded Signal")
xlabel("f (Hz)")
ylabel("|P1(f)|")

如图所示:

参数说明

X — 输入数组

        输入数组,指定为向量、矩阵或多维数组。

        如果 X 为 0×0 空矩阵,则 fft(X) 返回一个 0×0 空矩阵。

n — 变换长度

        变换长度,指定为 [] 或非负整数标量。为变换长度指定正整数标量可以改进 fft 的性能。通常,长度指定为 2 的幂或可分解为小质数的乘积的值。(质因数不大于 7)。如果 n 小于信号的长度,则 fft 忽略第 n 个条目之后的其余信号值,并返回截断后的结果。如果 n 为 0,则 fft 返回空矩阵。

dim — 沿其运算的维度

沿其运算的维度,指定为正整数标量。如果不指定维度,则默认为第一个大于 1 的数组维度。

  • fft(X,[],1) 沿 X 的各列进行运算,并返回每列的傅里叶变换。

    fft(X,[],1) column-wise operation

  • fft(X,[],2) 沿 X 的各行进行运算,并返回每行的傅里叶变换。

    fft(X,[],2) row-wise operation

        如果 dim 大于 ndims(X),则 fft(X,[],dim) 返回 X。当指定 n 时,fft(X,n,dim) 将对 X 进行填充或截断,以使维度 dim 的长度为 n。

Y — 频域表示

        频域表示,以向量、矩阵或多维数组形式返回。

        如果 X 的类型为 single,则 fft 本身以单精度进行计算,Y 的类型也是 single。否则,Y 以 double 类型返回。

Y 的大小如下:

  • 对于 Y = fft(X) 或 Y = fft(X,[],dim),Y 的大小等于 X 的大小。

  • 对于 Y = fft(X,n,dim),size(Y,dim) 的值等于 n,而所有其他维度的大小保持与在 X 中相同。

如果 X 为实数,则 Y 是共轭对称的,且 Y 中特征点的数量为 ceil((n+1)/2)。

向量的离散傅里叶变换

        Y = fft(X) 和 X = ifft(Y) 分别实现傅里叶变换和傅里叶逆变换。对于长度为 n 的 X 和 Y,这些变换定义如下:

其中

        为 n 次单位根之一。

提示

  • fft 的执行时间取决于变换的长度。仅具有小质因数(不大于 7)的变换长度的执行时间明显快于本身是质数或具有较大质因数的变换长度的执行时间。

  • 对于大多数 n 值,实数输入的 DFT 需要的计算时间大致是复数输入的 DFT 计算时间的一半。但是,当 n 有较大的质因数时,速度很少有差别或没有差别。

  • ​使用工具函数 fftw 可能会提高 fft 的速度。此函数控制用于计算特殊大小和维度的 FFT 算法优化。​

算法

        ​FFT 函数(fft、fft2、fftn、ifft、ifft2、ifftn)基于一个称为 FFTW [1] [2] 的库。

相关文章:

MATLAB中fft函数用法

目录 语法 说明 示例 含噪信号 高斯脉冲 余弦波 正弦波的相位 FFT 的插值 fft函数的功能是对数据进行快速傅里叶变换。 语法 Y fft(X) Y fft(X,n) Y fft(X,n,dim) 说明 ​Y fft(X) 用快速傅里叶变换 (FFT) 算法计算 X 的离散傅里叶变换 (DFT)。 如果 X 是向量&…...

【SpringBoot】【JWT】使用JWT的claims()方法存入Integer类型数据自动转为Double类型

生成令牌时使用Map存入Integer类型数据&#xff0c;将map使用claims方法放入JWT令牌后&#xff0c;取出时变成Double类型&#xff0c;强转报错&#xff1a; 解决&#xff1a; 将Integer转为String后存入JWT令牌&#xff0c;不会被自动转为其他类型&#xff0c;取出后转为Integ…...

Crack SmartGit

感谢大佬提供的资源 一、正常安装SmartGit 二、下载crackSmartGit crackSmartGit 发行版 - Gitee.com 三、使用crackSmartGit 1. 打开用户目录&#xff1a;C:\Users%用户名%\AppData\Roaming\syntevo\SmartGit。将crackSmartGit.jar和license.zip拷贝至 用户目录。 2. 用户…...

【备赛】在keil5里面创建新文件的方法+添加lcd驱动

一、先创建出文件夹和相应的.c和.h文件 因为在软件里面创建出的是在MDk文件那里面的&#xff0c;实际上是不存在你的新文件夹里的。 二、在keil5软件里面操作 1&#xff09;添加文件夹 -*---------------------------------------------------------- 这里最好加上相对路径&…...

Rk3568驱动开发_驱动实现流程以及本质_3

1设备号&#xff1a; cat /proc/devices 编写驱动模块需要要想加载到内核并与设备正常通信&#xff0c;那就需要申请一个设备号&#xff0c;用cat /proc/devices可以查看已经被占用的设备号 设备号有什么用&#xff1f;不同设备其驱动实现不同用设备号去区分&#xff0c;例如字…...

【学习笔记】LLM+RL

文章目录 1 合成数据与模型坍缩&#xff08;model collapse&#xff09;,1.1 递归生成数据与模型坍缩1.2 三种错误1.3 理论直觉1.4 PPL指标 2 基于开源 LLM 实现 O1-like step by step 慢思考&#xff08;slow thinking&#xff09;&#xff0c;ollama&#xff0c;streamlit2.1…...

深入理解IP子网掩码子网划分{作用} 以及 不同网段之间的ping的原理 以及子网掩码的区域划分

目录 子网掩码详解 子网掩码定义 子网掩码进一步解释 子网掩码的作用 计算总结表 子网掩码计算 子网掩码对应IP数量计算 判断IP是否在同一网段 1. 计算步骤 2. 示例 3. 关键点 总结 不同网段通信原理与Ping流程 1. 同网段通信 2. 跨网段通信 网段计算示例 3. P…...

rust 前端npm依赖工具rsup升级日志

rsup是使用 rust 编写的一个前端 npm 依赖包管理工具&#xff0c;可以获取到项目中依赖包的最新版本信息&#xff0c;并通过 web 服务的形式提供查看、升级操作等一一系列操作。 在前一篇文章中&#xff0c;记录初始的功能设计&#xff0c;自己的想法实现过程。在自己的使用过…...

2.2 STM32F103C8T6最小系统板的四种有关固件的开发方式

2.2.1 四种有关固件的开发方式 四种有关于固件的开发方式从时间线由远及近分别是&#xff1a;寄存器开发、标准外设驱动库开发、硬件抽象层库开发、底层库开发。 四种开发方式各有优缺点&#xff0c;可以参考ST官方的测试与说明。 1.寄存器开发 寄存器编程对于从51等等芯片过渡…...

【C++】 stack和queue以及模拟实现

一、stack及其模拟实现 1.1 stack介绍 stack是一种容器适配器&#xff0c;专门用在具有后进先出操作的上下文环境中&#xff0c;其删除只能从容器的一端进行 元素的插入与提取操作。stack是作为容器适配器被实现的&#xff0c;容器适配器即是对特定类封装作为其底层的容器&am…...

python与C系列语言的差异总结(2)

Python有很多表达布尔值的方式&#xff0c;布尔常量False、0、Python零值None、空值&#xff08;如空的列表[]和空字符串""&#xff09;&#xff0c;都被视为False。布尔常量True和其他一切值都被视为True。但不相等。这个自由度相比C类语言更加高。 if (not None):…...

Linux之文件系统

1.前言 文件 内容属性 文件分为被打开的文件&#xff08;跟基础IO有关&#xff0c;在内存上&#xff09;和没有被打开的文件(在磁盘上)。 在磁盘上找没有被打开的文件属于文件系统的工作 2.对硬件的理解 2.1 磁盘&#xff0c;服务器&#xff0c;机柜&#xff0c;机房 1.磁…...

LeetCode刷题 -- 23. 合并 K 个升序链表

小根堆排序与合并 K 个有序链表的实现 1. 介绍 本技术文档详细介绍了如何使用 小根堆&#xff08;Min Heap&#xff09; 实现 K 个有序链表的合并。 核心思想是&#xff1a; 使用 小根堆 维护当前最小的节点。每次取出堆顶元素&#xff08;最小值&#xff09;加入合并链表&…...

DeepSeek在MATLAB上的部署与应用

在科技飞速发展的当下&#xff0c;人工智能与编程语言的融合不断拓展着创新边界。DeepSeek作为一款备受瞩目的大语言模型&#xff0c;其在自然语言处理领域展现出强大的能力。而MATLAB&#xff0c;作为科学计算和工程领域广泛应用的专业软件&#xff0c;拥有丰富的工具包和高效…...

mapbox基础,使用geojson加载fill-extrusion三维填充图层

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.2 ☘️mapboxgl.Map style属性1.3 ☘️fill-extrusion三维填充图层样式二、�…...

基于 SpringBoot 的 “电影交流平台小程序” 系统的设计与实现

大家好&#xff0c;今天要和大家聊的是一款基于 SpringBoot 的 “电影交流平台小程序” 系统的设计与实现。项目源码以及部署相关事宜请联系我&#xff0c;文末附上联系方式。 项目简介 基于 SpringBoot 的 “电影交流平台小程序” 系统设计与实现的主要使用者分为 管理员 和…...

单片机裸机编程-时机管理

对于 RTOS 实时操作系统&#xff0c;我们是通过 TASK&#xff08;任务&#xff09;进行底层操作的&#xff0c;这与裸机编程中的函数&#xff08;fun&#xff09;类似。不同的任务或函数实现不同的功能&#xff0c;在RTOS中&#xff0c;单片机有信号量、队列等不同任务之间的通…...

Flutter系列教程之(2)——Dart语言快速入门

目录 1.变量与类型 1.1 num类型 1.2 String类型 1.3 Object与Dynamic 1.4 类型判断/转换 1.5 变量和常量 2.方法/函数 3.类、接口、抽象类 3.1 类 3.2 接口 4.集合 4.1 List 4.2 Set 4.3 Map 5.总结 Dart语言的语法和Kotlin、Java有类似之处&#xff0c;这里就通…...

pyecharts介绍

文章目录 介绍安装pyecharts基本使用全局配置选项 折线图相关配置地图模块使用柱状图使用 介绍 echarts虑是个由百度开源的数据可视化&#xff0c;凭借着良好的交互性&#xff0c;精巧的图表设计&#xff0c;得到了众多开发者的认可&#xff0c;而Pyhon是门富有表达力的语言&a…...

前缀和相关题目记录(未完待续...)

1 前缀和 一维前缀和是指对于一个数组 a a a&#xff0c;我们定义一个新的数组 s s s&#xff0c;其中每个元素 s [ i ] s[i] s[i] 表示从数组开头到第 i i i 个元素的累加和&#xff1a; s [ i ] a [ 1 ] a [ 2 ] ⋯ a [ i ] ∑ j 1 i a [ j ] s[i] a[1] a[2] \…...

KEA128与S32K144的LIN主从机实战:从硬件对接到波形调试全记录

KEA128与S32K144的LIN总线异构通信实战&#xff1a;从硬件设计到波形分析的完整指南 在汽车电子系统中&#xff0c;LIN总线作为CAN网络的补充&#xff0c;广泛应用于车门、座椅、空调等低复杂度控制场景。本文将基于NXP KEA128和S32K144两款不同架构的MCU&#xff0c;构建一个完…...

别再手动检查了!用testssl.sh一键扫描你的网站TLS/SSL安全配置(附详细报告解读)

企业级TLS安全巡检实战&#xff1a;用testssl.sh构建自动化漏洞防御体系 当OpenSSL团队在2014年4月7日悄无声息地发布那个仅有12字节的补丁时&#xff0c;恐怕没人想到这个编号CVE-2014-0160的漏洞会掀起互联网安全领域的惊涛骇浪。Heartbleed漏洞犹如一记警钟&#xff0c;让全…...

Koikatu HF Patch终极指南:如何快速优化你的Koikatsu游戏体验

Koikatu HF Patch终极指南&#xff1a;如何快速优化你的Koikatsu游戏体验 【免费下载链接】KK-HF_Patch Automatically translate, uncensor and update Koikatu! and Koikatsu Party! 项目地址: https://gitcode.com/gh_mirrors/kk/KK-HF_Patch Koikatu HF Patch是一款…...

别再只盯着I2C了!聊聊SoC里那个低调的音频管家:I2S协议详解

别再只盯着I2C了&#xff01;聊聊SoC里那个低调的音频管家&#xff1a;I2S协议详解 当工程师们讨论SoC内部通信协议时&#xff0c;I2C和SPI总是最先被提及的明星。但如果你正在设计音频子系统&#xff0c;有一个更重要的协议却常常被忽视——它就是I2S。这个默默工作在幕后的音…...

【EF Core 10向量搜索企业落地白皮书】:20年微软MVP亲授高并发、低延迟、可审计的向量检索架构设计

第一章&#xff1a;EF Core 10向量搜索扩展的企业级定位与演进全景EF Core 10 向量搜索扩展并非孤立的功能补丁&#xff0c;而是微软在 AI 原生数据访问层战略中的一次关键跃迁。它将传统 ORM 的关系建模能力与现代向量数据库的语义检索能力深度融合&#xff0c;使企业能在统一…...

别再死记硬背了!用华为eNSP模拟器5分钟搞懂MPLS TE隧道配置全流程

华为eNSP实战&#xff1a;5分钟可视化掌握MPLS TE隧道配置精髓 网络工程师的日常工作中&#xff0c;最令人头疼的莫过于面对一堆抽象协议概念却无从下手。MPLS TE&#xff08;多协议标签交换流量工程&#xff09;作为运营商级网络的核心技术&#xff0c;传统学习方式往往让初学…...

避开安川MP3300通讯的那些坑:服务端/客户端模式选择、地址分配与MSG函数配置详解

安川MP3300工业通讯实战&#xff1a;服务端/客户端模式深度解析与高阶配置 在工业自动化系统集成中&#xff0c;安川MP3300控制器与上位机的稳定通讯往往是项目成败的关键分水岭。许多工程师在完成基础配置后&#xff0c;仍会在实际调试阶段遭遇各种"幽灵问题"——通…...

C# 14原生AOT打包Dify客户端,从218MB到12MB,微软官方未公开的6步精简法,仅限首批内测开发者掌握

第一章&#xff1a;C# 14 原生 AOT 部署 Dify 客户端 2026 最新趋势C# 14 引入的原生 AOT&#xff08;Ahead-of-Time&#xff09;编译能力已深度集成至 .NET SDK 9.0&#xff0c;并成为构建高性能、零依赖 AI 客户端的事实标准。Dify 作为开源 LLM 应用编排平台&#xff0c;其官…...

从‘线性估计’的工程应用反推:为什么机器学习中的梯度下降要求函数可微?

梯度下降为何要求函数可微&#xff1f;从工程视角看数学约束 在机器学习项目的实际开发中&#xff0c;我们常常不假思索地调用现成的优化器&#xff0c;比如TensorFlow的AdamOptimizer或PyTorch的SGD。这些优化器的核心都是梯度下降算法&#xff0c;而所有梯度下降的实现都隐含…...

让你的技术文档和Readme“活”起来:GitHub/GitLab Markdown表情使用指南与最佳实践

让你的技术文档和Readme“活”起来&#xff1a;GitHub/GitLab Markdown表情使用指南与最佳实践 在开源项目的世界里&#xff0c;第一印象往往决定了开发者是否会驻足深入了解你的项目。而技术文档和Readme作为项目的"门面"&#xff0c;如何让它们在众多同类项目中脱颖…...