diff
差分和近似导数
说明
计算沿大小不等于 1 的第一个数组维度的 Y
= diff(X
)X
相邻元素之间的差分:
如果
X
是长度为m
的向量,则Y = diff(X)
返回长度为m-1
的向量。Y
的元素是X
相邻元素之间的差分。Y = [X(2)-X(1) X(3)-X(2) ... X(m)-X(m-1)]
如果
X
是不为空的非向量 p×m 矩阵,则Y = diff(X)
返回大小为 (p-1)×m 的矩阵,其元素是X
的行之间的差分。Y = [X(2,:)-X(1,:); X(3,:)-X(2,:); ... X(p,:)-X(p-1,:)]
如果
X
是 0×0 的空矩阵,则Y = diff(X)
返回 0×0 的空矩阵。
示例
向量元素之间的差分
创建一个向量,然后计算元素之间的差分。
X = [1 1 2 3 5 8 13 21]; Y = diff(X)
Y = 1×7
0 1 1 2 3 5 8
请注意,Y
的元素比 X
少一个。
矩阵行之间的差分
创建一个 3×3 矩阵,然后计算各行之间的一阶差分。
X = [1 1 1; 5 5 5; 25 25 25]; Y = diff(X)
Y = 2×3
4 4 4
20 20 20
Y
是 2×3 矩阵。
多阶差分
矩阵列之间的差分
创建一个 3×3 矩阵,然后计算各列之间的一阶差分。
X = [1 3 5;7 11 13;17 19 23]; Y = diff(X,1,2)
Y = 3×2
2 2
4 2
2 4
Y
是一个 3×2 矩阵。
使用差分求导数近似值
使用 diff
函数和语法 Y = diff(f)/h
求偏导数近似值,其中 f
是函数值在某些域 X
上计算的向量,h
是一个相应的步长。
例如,sin(x)
相对于 x
的一阶导数为 cos(x)
,相对于 x
的二阶导数为 -sin(x)
。可以使用 diff
求这些导数的近似值。
h = 0.001; % step size X = -pi:h:pi; % domain f = sin(X); % range Y = diff(f)/h; % first derivative Z = diff(Y)/h; % second derivative plot(X(:,1:length(Y)),Y,'r',X,f,'b', X(:,1:length(Z)),Z,'k')
在此绘图中,蓝色线条对应原始函数 sin
。红色线条对应计算出的一阶导数 cos
,黑色线条对应计算出的二阶导数 -sin
。
日期时间值之间的差
创建一个等间距日期时间值序列,并计算这些值之间的时间差。
t1 = datetime('now');
t2 = t1 + minutes(5);
t = t1:minutes(1.5):t2
t = 1x4 datetime
Columns 1 through 3
27-Aug-2022 00:51:47 27-Aug-2022 00:53:17 27-Aug-2022 00:54:47
Column 4
27-Aug-2022 00:56:17
dt = diff(t)
dt = 1x3 duration
00:01:30 00:01:30 00:01:30
diff
返回 duration
数组。
输入参数
X
— 输入数组
向量 | 矩阵 | 多维数组
输入数组,指定为向量、矩阵或多维数组。X
可以是数值数组、逻辑数组、日期时间数组或持续时间数组。
复数支持: 是
n
— 差分阶数
正整数标量 | []
差分阶数,指定为正整数标量或 []
。n
的默认值为 1。
可以将 n
指定为足够大,以让 dim
减少为单一 (size(X,dim) = 1
) 维度。发生这种情况时,diff
继续沿大小不等于 1 的下一个数组维度计算。此过程会一直继续,直至返回一个 0×0 的空矩阵。
数据类型: single
| double
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
dim
— 沿其运算的维度
正整数标量
沿其运算的维度,指定为正整数标量。如果不指定维度,则默认为第一个大于 1 的数组维度。
以一个二维 p x m 输入数组 A
为例:
diff(A,1,1)
会对A
的列中的连续元素进行处理,然后返回 (p-1)xm 的差分矩阵。diff(A,1,2)
会对A
的行中的连续元素进行处理,然后返回 px(m-1) 的差分矩阵。
数据类型: double
| single
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
输出参数
Y
— 差分数组
标量 | 向量 | 矩阵 | 多维数组
差分数组,以标量、向量、矩阵或多维数组形式返回。如果 X
是一个非空数组,则由 diff
所处理的 X
的维度在输出中的大小将减小 n
。
扩展功能
tall 数组
对行数太多而无法放入内存的数组进行计算。
C/C++ 代码生成
使用 MATLAB® Coder™ 生成 C 代码和 C++ 代码。
用法说明和限制:
如果提供表示应用
diff
的次数以及用来计算差异的维度的参数,则它们必须为常量。请参阅Variable-Sizing Restrictions for Code Generation of Toolbox Functions (MATLAB Coder)。
代码生成不支持对此函数使用稀疏矩阵输入。
基于线程的环境
使用 MATLAB® backgroundPool
在后台运行代码或使用 Parallel Computing Toolbox™ ThreadPool
加快代码运行速度。
此函数完全支持基于线程的环境。有关详细信息,请参阅Run MATLAB Functions in Thread-Based Environment。
GPU 数组
通过使用 Parallel Computing Toolbox™ 在图形处理单元 (GPU) 上运行来加快代码执行。
此函数完全支持 GPU 数组。有关详细信息,请参阅Run MATLAB Functions on a GPU (Parallel Computing Toolbox)。
分布式数组
使用 Parallel Computing Toolbox™ 在集群的组合内存中对大型数组进行分区。
此函数完全支持分布式数组。有关详细信息,请参阅Run MATLAB Functions with Distributed Arrays (Parallel Computing Toolbox)。
版本历史记录
在 R2006a 之前推出R2022a: 改进了处理大量元素时的性能
在对包含至少 105 个元素的向量执行运算时,或在对包含至少 5×105 个元素的矩阵和多维数组的第一个或第二个维度执行运算时,diff
函数的性能得到改进。
例如,以下代码构造一个包含 2.5×107 个元素的双精度数,并计算相邻元素之间的差异。代码的运行速度约为上一版本的 2.4 倍:
function timingDiff rng default N = 5000; A = rand(N); tic for k = 1:40 D = diff(A); end toc end
大致的执行时间是:
R2021b:2.43 秒
R2022a:1.00 秒
代码是在运行 Windows® 10 的 Intel® Xeon® CPU E5-1650 v4 @ 3.60 GHz 测试系统上通过调用 timingDiff
函数进行计时的。
MATLAB 命令
您点击的链接对应于以下 MATLAB 命令:
请在 MATLAB 命令行窗口中直接输入以执行命令。Web 浏览器不支持 MATLAB 命令。
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)