smoothdata
对含噪数据进行平滑处理
语法
说明
使用一个或多个名称-值参数指定用于平滑处理的其他参数。例如,如果 B
= smoothdata(___,Name,Value
)t
是时间值向量,则 smoothdata(A,'SamplePoints',t)
相对于 t
中的时间对 A
中的数据进行平滑处理。
示例
使用移动平均值对数据进行平滑处理
创建含有含噪数据的向量,并使用移动平均值对数据进行平滑处理。绘制原始数据和经过平滑处理的数据。
x = 1:100; A = cos(2*pi*0.05*x+2*pi*rand) + 0.5*randn(1,100); B = smoothdata(A); plot(x,A,'-o',x,B,'-x') legend('Original Data','Smoothed Data')
含噪数据的矩阵
创建一个矩阵,其中的行表示三个含噪信号。使用移动平均值对三个信号进行平滑处理,并绘制经过平滑处理的数据。
x = 1:100; s1 = cos(2*pi*0.03*x+2*pi*rand) + 0.5*randn(1,100); s2 = cos(2*pi*0.04*x+2*pi*rand) + 0.4*randn(1,100) + 5; s3 = cos(2*pi*0.05*x+2*pi*rand) + 0.3*randn(1,100) - 5; A = [s1; s2; s3]; B = smoothdata(A,2); plot(x,B(1,:),x,B(2,:),x,B(3,:))
高斯滤波器
使用高斯加权移动平均滤波器对含噪数据向量进行平滑处理。显示滤波器使用的窗长度。
x = 1:100;
A = cos(2*pi*0.05*x+2*pi*rand) + 0.5*randn(1,100);
[B,window] = smoothdata(A,'gaussian');
window
window = 4
使用长度为 20 的较大窗口对原始数据进行平滑处理。绘制两种窗长度的平滑数据。
C = smoothdata(A,'gaussian',20); plot(x,B,'-o',x,C,'-x') legend('Small Window','Large Window')
包含 NaN
的向量
创建包含 NaN
值的含噪向量,对数据进行平滑处理并忽略 NaN
,这是默认设置。
A = [NaN randn(1,48) NaN randn(1,49) NaN]; B = smoothdata(A);
对包含 NaN
值的数据进行平滑处理。包含 NaN
的窗口中的平均值为 NaN
。
C = smoothdata(A,'includenan');
绘制 B
和 C
中经过平滑处理的数据图。
plot(1:100,B,'-o',1:100,C,'-x') legend('Ignore NaN','Include NaN')
使用样本点对数据进行平滑处理
创建对应于时间向量 t
的含噪数据的向量。相对于 t
中的时间对数据进行平滑处理,并绘制原始数据和经过平滑处理的数据图。
x = 1:100; A = cos(2*pi*0.05*x+2*pi*rand) + 0.5*randn(1,100); t = datetime(2017,1,1,0,0,0) + hours(0:99); B = smoothdata(A,'SamplePoints',t); plot(t,A,'-o',t,B,'-x') legend('Original Data','Smoothed Data')
输入参数
A
— 输入数据
向量 | 矩阵 | 多维数组 | 表 | 时间表
输入数据,指定为向量、矩阵、多维数组、表或时间表。如果 A
是表或时间表,则变量必须为数值,或者您必须使用 DataVariables
名称-值参数显式列出数值变量。当使用同时包含非数值变量的表时,指定变量很有用。
数据类型:double
| single
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
| logical
| table
| timetable
复数支持: 是
dim
— 运算维度
正整数标量
运算维度,指定为正整数标量。如果未指定值,则默认值是大小不等于 1 的第一个数组维度。
以一个 m
×n
输入矩阵 A
为例:
smoothdata(A,1)
平滑处理A
的每列中的数据,并返回一个m
×n
矩阵。smoothdata(A,2)
平滑处理A
的行中的数据,并返回一个m
×n
矩阵。
对于表或时间表输入数据,不支持 dim
,并且分别对每个表或时间表变量进行运算。
method
— 平滑处理方法
'movmean'
(默认) | 'movmedian'
| 'gaussian'
| 'lowess'
| 'loess'
| 'rlowess'
| 'rloess'
| 'sgolay'
平滑方法,指定为下列值之一:
'movmean'
-A
的每个窗口内的移动平均值。此方法对于减少数据中的周期性趋势很有用。'movmedian'
-A
的每个窗口内的移动中位数。当存在离群值时,此方法对于减少数据中的周期性趋势很有用。'gaussian'
-A
的每个窗口内的高斯加权移动平均值。'lowess'
-A
的每个窗口内的线性回归。该方法可能会耗费大量计算资源,但会减少不连续性。'loess'
-A
的每个窗口内的二次回归。此方法的计算开销略高于'lowess'
。'rlowess'
-A
的每个窗口内的稳健线性回归。此方法比'lowess'
方法的计算开销更大,不过它在处理离群值时更为稳健。'rloess'
-A
的每个窗口内的稳健二次回归。此方法比'loess'
方法的计算开销更大,不过它在处理离群值时更为稳健。'sgolay'
- Savitzky-Golay 滤波器,它根据在A
的每个窗口上拟合的二次多项式进行平滑处理。当数据变化很快时,此方法可能比其他方法更有效。
window
— 窗长度
正整数标量 | 由正整数组成的二元素向量 | 正持续时间标量 | 由正持续时间组成的二元素向量
窗长度,指定为正整数标量、由正整数组成的二元素向量、正持续时间标量或由正持续时间组成的二元素向量。
如果 window
是正整数标量,则窗以当前元素为中心并且包含 window-1
个相邻元素。如果 window
是偶数,则窗口以当前元素和上一个元素为中心。
如果 window
是由正整数组成的二元素向量 [b f]
,则窗口包含当前元素、其之前的 b
个元素和之后的 f
个元素。
当 A
是时间表或 SamplePoints
指定为 datetime
或 duration
向量时,window
的类型必须为 duration
,并相对于样本点计算窗口。
当窗长度还指定为输出参数时,输出值与输入值匹配。
nanflag
— NaN
条件
'omitnan'
(默认) | 'includenan'
NaN
条件,指定为下列值之一:
'omitnan'
- 忽略输入中的NaN
值。如果窗口所包含的值全部为NaN
,则smoothdata
返回NaN
。'includenan'
- 在每个窗口内计算时包括NaN
值,得到NaN
。
名称-值参数
将可选的参数对组指定为 Name1=Value1,...,NameN=ValueN
,其中 Name
是参数名称,Value
是对应的值。名称-值参数必须出现在其他参数之后,但参数对组的顺序无关紧要。
在 R2021a 之前,使用逗号分隔每个名称和值,并用引号将 Name
引起来。
示例: smoothdata(A,'SmoothingFactor',0.5)
SamplePoints
— 样本点
向量 | 表变量名称 | 标量 | 函数句柄 | 表 vartype
下标
采样点,指定为由采样点值组成的向量或下表中的选项之一(当输入数据为表时)。样本点代表数据的 x 轴位置,必须为有序且包含唯一的元素。样本点不需要均匀采样。向量 [1 2 3 ...]
是默认值。
当输入数据是表时,可以使用以下选项之一将采样点指定为表变量:
表输入的选项 | 描述 | 示例 |
---|---|---|
变量名称 | 指定单个表变量名称的字符向量或标量字符串 |
|
标量变量索引 | 标量表变量索引 |
|
逻辑向量 | 逻辑向量,每个元素分别对应一个表变量,其中 |
|
函数句柄 | 函数句柄,以表变量作为输入并返回逻辑标量,对于仅一个表变量,该标量必须为 |
|
vartype 下标 | 由 |
|
注意
当输入数据为 timetable
时,不支持此名称-值参数。时间表使用行时间向量作为采样点。要使用不同采样点,您必须编辑时间表,以便行时间包含所需的采样点。
移动窗基于样本点进行定义。例如,如果 t
是与输入数据对应的时间向量,则 smoothdata(rand(1,10),3,'SamplePoints',t)
将有一个代表 t(i)-1.5
和 t(i)+1.5
之间时间间隔的窗。
当样本点向量的数据类型为 datetime
或 duration
时,移动窗长度的类型必须为 duration
。
示例: smoothdata(A,'SamplePoints',0:0.1:10)
示例: smoothdata(T,'SamplePoints',"Var1")
数据类型: double
| single
| datetime
| duration
DataVariables
— 要对其进行操作的表变量
表变量名称 | 标量 | 向量 | 元胞数组 | 函数句柄 | 表 vartype
下标
要对其进行操作的表变量,指定为下表中的选项之一。DataVariables
值指示要对输入表的哪些变量进行平滑处理。
表中未由 DataVariables
指定的其他变量会传递给输出,而不会对其进行平滑处理。
选项 | 描述 | 示例 |
---|---|---|
变量名称 | 指定单个表变量名称的字符向量或字符串标量 |
|
变量名称的向量 | 字符向量元胞数组或字符串数组,其中每个元素表示一个表变量名称 |
|
变量索引的标量或向量 | 表变量索引的标量或向量 |
|
逻辑向量 | 逻辑向量,每个元素分别对应一个表变量,其中 |
|
函数句柄 | 函数句柄,以表变量作为输入并返回逻辑标量 |
|
vartype 下标 | 由 |
|
示例: smoothdata(T,'DataVariables',["Var1" "Var2" "Var4"])
ReplaceValues
— 替换值指示符
true
或 1
(默认) | false
或 0
替换值指示符,当 A
是表或时间表时,指定为以下值之一:
true
或1
- 将输入表变量替换为包含经过平滑处理的数据的表变量。false
或0
- 在输入表变量中追加包含经过平滑处理的数据的表变量。
对于向量、矩阵或多维数组输入数据,不支持 ReplaceValues
。
示例: smoothdata(T,'ReplaceValues',false)
SmoothingFactor
— 窗口大小因子
0 到 1 之间的标量
窗口大小因子,指定为范围从 0 到 1 的标量。通常,SmoothingFactor
的值通过缩放启发式窗口大小,调整平滑处理的级别。接近 0 的值会产生较小的移动窗长度,从而导致较少的平滑处理。接近 1 的值会产生较大的移动窗长度,从而促成较多的平滑处理。在某些情况下,根据确定启发式窗口大小的输入数据,SmoothingFactor
的值可能不会对 smoothdata
使用的窗口大小产生显著影响。
默认情况下,SmoothingFactor
为 0.25,并且仅在未指定 window
时指定。
Degree
— Savitzky-golay 阶数
非负整数
Savitzky-Golay 阶数,指定为非负整数。仅当指定的平滑处理方法为 'sgolay'
时,才能指定此名称-值参数。Degree
的值对应于 Savitzky-golay 滤波器中多项式的次数,该次数适合每个窗口内的数据,默认为 2。
对于均匀样本点,Degree
的值必须小于窗口长度。对于非均匀样本点,该值必须小于任意窗口中的最大点数。
输出参数
B
— 经过平滑处理的数据
向量 | 矩阵 | 多维数组 | 表 | 时间表
经过平滑处理的数据,以向量、矩阵、多维数组、表或时间表形式返回。
除非 ReplaceValues
的值为 false
,否则 B
与 A
的大小相同。如果 ReplaceValues
的值是 false
,则 B
的宽度是输入数据宽度和指定的数据变量数目之和。
window
— 窗长度
正整数标量 | 由正整数组成的二元素向量 | 正持续时间标量 | 由正持续时间组成的二元素向量
窗长度,以正整数标量、由正整数组成的二元素向量、正持续时间标量或由正持续时间组成的二元素向量形式返回。
当 window
指定为输入参数时,输出值与输入值匹配。当 window
未指定为输入参数时,其值是由 smoothdata
基于输入数据启发性确定的标量。
算法
当没有为平滑处理方法指定窗口大小时,smoothdata
将基于启发式算法计算默认窗口大小。对于平滑处理因子 τ,启发式算法将估算其衰减量大约为输入数据能量的 100*τ% 的移动平均窗口大小。
扩展功能
tall 数组
对行数太多而无法放入内存的数组进行计算。
用法说明和限制:
不支持 tall 时间表。
不支持
'rlowess'
和'rloess'
方法。不支持多个输出。
您必须指定窗口大小。不支持自动选择窗口大小。
不支持
SamplePoints
和SmoothingFactor
名称-值参数。DataVariables
的值不能是函数句柄。
有关详细信息,请参阅 tall 数组。
C/C++ 代码生成
使用 MATLAB® Coder™ 生成 C 代码和 C++ 代码。
用法说明和限制:
不支持
ReplaceValues
名称-值参数。dim
必须为常量。对于复数输入
A
,必须指定window
参数。不支持可变大小
window
参数。对于固定大小的代码生成,除
A
之外的所有输入参数都必须为常量。对于日期时间
SamplePoints
值或具有日期时间RowTimes
的时间表输入数据,必须指定窗口大小。
基于线程的环境
使用 MATLAB® backgroundPool
在后台运行代码或使用 Parallel Computing Toolbox™ ThreadPool
加快代码运行速度。
此函数完全支持基于线程的环境。有关详细信息,请参阅Run MATLAB Functions in Thread-Based Environment。
版本历史记录
在 R2017a 中推出R2022a: 追加经过平滑处理的值
对于表或时间表输入数据,通过将 ReplaceValues
名称-值参数设置为 false
,可以在输入表变量中追加包含经过平滑处理的数据的表变量,而不是替换为包含经过平滑处理的数据的表变量。
R2021b: 将采样点指定为表变量
对于表输入数据,可以使用 SamplePoints
名称-值参数将采样点指定为表变量。
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)