Main Content

smoothdata

对含噪数据进行平滑处理

说明

示例

B = smoothdata(A) 使用以启发方式确定的固定窗长度返回向量元素的移动平均值。窗口向下滑动向量的长度,计算每个窗口中的元素的平均值。

  • 如果 A 为矩阵,smoothdata 计算 A 的每列的移动平均值。

  • 如果 A 是多维数组,则 smoothdata 沿 A 的大小不等于 1 的第一个维度进行运算。

  • 如果 A 是包含数值变量的表或时间表,则 smoothdata 针对 A 的每个变量单独执行运算。

示例

B = smoothdata(A,dim) 指定要沿其进行运算的 A 的维度。例如,如果 A 是一个矩阵,则 smoothdata(A,2)A 中的每行数据进行平滑处理。

示例

B = smoothdata(___,method) 为上述任一语法指定平滑处理方法。例如,smoothdata(A,'sgolay') 使用 Savitzky-golay 滤波器对 A 中的数据进行平滑处理。

示例

B = smoothdata(___,method,window) 指定平滑处理方法使用的窗口长度。例如,smoothdata(A,'movmedian',5) 通过求五元素滑动窗的中位数,来对 A 中的数据进行平滑处理。

示例

B = smoothdata(___,nanflag) 指定在使用上述任一语法时如何处理 NaN 值。'omitnan' 将忽略 NaN 值,'includenan' 则会在每个窗口中进行计算时包含 NaN 值。

示例

B = smoothdata(___,Name,Value) 使用一个或多个名称-值参数指定用于平滑处理的其他参数。例如,如果 t 是时间值向量,则 smoothdata(A,'SamplePoints',t) 相对于 t 中的时间对 A 中的数据进行平滑处理。

示例

[B,window] = smoothdata(___) 还会返回移动窗长度。

示例

全部折叠

创建含有含噪数据的向量,并使用移动平均值对数据进行平滑处理。绘制原始数据和经过平滑处理的数据。

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')

Figure contains an axes object. The axes object contains 2 objects of type line. These objects represent 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,:))

Figure contains an axes object. The axes object contains 3 objects of type line.

使用高斯加权移动平均滤波器对含噪数据向量进行平滑处理。显示滤波器使用的窗长度。

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,这是默认设置。

A = [NaN randn(1,48) NaN randn(1,49) NaN];
B = smoothdata(A);

对包含 NaN 值的数据进行平滑处理。包含 NaN 的窗口中的平均值为 NaN

C = smoothdata(A,'includenan');

绘制 BC 中经过平滑处理的数据图。

plot(1:100,B,'-o',1:100,C,'-x')
legend('Ignore NaN','Include NaN')

Figure contains an axes object. The axes object contains 2 objects of type line. These objects represent 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')

Figure contains an axes object. The axes object contains 2 objects of type line. These objects represent Original Data, Smoothed Data.

输入参数

全部折叠

输入数据,指定为向量、矩阵、多维数组、表或时间表。如果 A 是表或时间表,则变量必须为数值,或者您必须使用 DataVariables 名称-值参数显式列出数值变量。当使用同时包含非数值变量的表时,指定变量很有用。

数据类型:double | single | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | logical | table | timetable

复数支持:

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

以一个 m×n 输入矩阵 A 为例:

  • smoothdata(A,1) 平滑处理 A 的每列中的数据,并返回一个 m×n 矩阵。

    smoothdata(A,1) column-wise operation

  • smoothdata(A,2) 平滑处理 A 的行中的数据,并返回一个 m×n 矩阵。

    smoothdata(A,2) row-wise operation

对于表或时间表输入数据,不支持 dim,并且分别对每个表或时间表变量进行运算。

平滑方法,指定为下列值之一:

  • 'movmean' - A 的每个窗口内的移动平均值。此方法对于减少数据中的周期性趋势很有用。

  • 'movmedian' - A 的每个窗口内的移动中位数。当存在离群值时,此方法对于减少数据中的周期性趋势很有用。

  • 'gaussian' - A 的每个窗口内的高斯加权移动平均值。

  • 'lowess' - A 的每个窗口内的线性回归。该方法可能会耗费大量计算资源,但会减少不连续性。

  • 'loess' - A 的每个窗口内的二次回归。此方法的计算开销略高于 'lowess'

  • 'rlowess' - A 的每个窗口内的稳健线性回归。此方法比 'lowess' 方法的计算开销更大,不过它在处理离群值时更为稳健。

  • 'rloess' - A 的每个窗口内的稳健二次回归。此方法比 'loess' 方法的计算开销更大,不过它在处理离群值时更为稳健。

  • 'sgolay' - Savitzky-Golay 滤波器,它根据在 A 的每个窗口上拟合的二次多项式进行平滑处理。当数据变化很快时,此方法可能比其他方法更有效。

窗长度,指定为正整数标量、由正整数组成的二元素向量、正持续时间标量或由正持续时间组成的二元素向量。

如果 window 是正整数标量,则窗以当前元素为中心并且包含 window-1 个相邻元素。如果 window 是偶数,则窗口以当前元素和上一个元素为中心。

如果 window 是由正整数组成的二元素向量 [b f],则窗口包含当前元素、其之前的 b 个元素和之后的 f 个元素。

A 是时间表或 SamplePoints 指定为 datetimeduration 向量时,window 的类型必须为 duration,并相对于样本点计算窗口。

当窗长度还指定为输出参数时,输出值与输入值匹配。

NaN 条件,指定为下列值之一:

  • 'omitnan' - 忽略输入中的 NaN 值。如果窗口所包含的值全部为 NaN,则 smoothdata 返回 NaN

  • 'includenan' - 在每个窗口内计算时包括 NaN 值,得到 NaN

名称-值参数

将可选的参数对组指定为 Name1=Value1,...,NameN=ValueN,其中 Name 是参数名称,Value 是对应的值。名称-值参数必须出现在其他参数之后,但参数对组的顺序无关紧要。

在 R2021a 之前,使用逗号分隔每个名称和值,并用引号将 Name 引起来。

示例: smoothdata(A,'SmoothingFactor',0.5)

数据选项

全部折叠

采样点,指定为由采样点值组成的向量或下表中的选项之一(当输入数据为表时)。样本点代表数据的 x 轴位置,必须为有序且包含唯一的元素。样本点不需要均匀采样。向量 [1 2 3 ...] 是默认值。

当输入数据是表时,可以使用以下选项之一将采样点指定为表变量:

表输入的选项描述示例
变量名称

指定单个表变量名称的字符向量或标量字符串

'Var1'

"Var1"

标量变量索引

标量表变量索引

3

逻辑向量

逻辑向量,每个元素分别对应一个表变量,其中 true 将对应的变量指定为采样点,所有其他元素为 false

[true false false]

函数句柄

函数句柄,以表变量作为输入并返回逻辑标量,对于仅一个表变量,该标量必须为 true

@isnumeric

vartype 下标

vartype 函数生成的表下标,该函数只返回一个变量的一个下标

vartype('numeric')

注意

当输入数据为 timetable 时,不支持此名称-值参数。时间表使用行时间向量作为采样点。要使用不同采样点,您必须编辑时间表,以便行时间包含所需的采样点。

移动窗基于样本点进行定义。例如,如果 t 是与输入数据对应的时间向量,则 smoothdata(rand(1,10),3,'SamplePoints',t) 将有一个代表 t(i)-1.5t(i)+1.5 之间时间间隔的窗。

当样本点向量的数据类型为 datetimeduration 时,移动窗长度的类型必须为 duration

示例: smoothdata(A,'SamplePoints',0:0.1:10)

示例: smoothdata(T,'SamplePoints',"Var1")

数据类型: double | single | datetime | duration

要对其进行操作的表变量,指定为下表中的选项之一。DataVariables 值指示要对输入表的哪些变量进行平滑处理。

表中未由 DataVariables 指定的其他变量会传递给输出,而不会对其进行平滑处理。

选项描述示例
变量名称

指定单个表变量名称的字符向量或字符串标量

'Var1'

"Var1"

变量名称的向量

字符向量元胞数组或字符串数组,其中每个元素表示一个表变量名称

{'Var1' 'Var2'}

["Var1" "Var2"]

变量索引的标量或向量

表变量索引的标量或向量

1

[1 3 5]

逻辑向量

逻辑向量,每个元素分别对应一个表变量,其中 true 指示包括对应变量,false 指示不包括对应变量。

[true false true]

函数句柄

函数句柄,以表变量作为输入并返回逻辑标量

@isnumeric

vartype 下标

vartype 函数生成的表下标

vartype("numeric")

示例: smoothdata(T,'DataVariables',["Var1" "Var2" "Var4"])

替换值指示符,当 A 是表或时间表时,指定为以下值之一:

  • true1 - 将输入表变量替换为包含经过平滑处理的数据的表变量。

  • false0 - 在输入表变量中追加包含经过平滑处理的数据的表变量。

对于向量、矩阵或多维数组输入数据,不支持 ReplaceValues

示例: smoothdata(T,'ReplaceValues',false)

平滑处理选项

全部折叠

窗口大小因子,指定为范围从 0 到 1 的标量。通常,SmoothingFactor 的值通过缩放启发式窗口大小,调整平滑处理的级别。接近 0 的值会产生较小的移动窗长度,从而导致较少的平滑处理。接近 1 的值会产生较大的移动窗长度,从而促成较多的平滑处理。在某些情况下,根据确定启发式窗口大小的输入数据,SmoothingFactor 的值可能不会对 smoothdata 使用的窗口大小产生显著影响。

默认情况下,SmoothingFactor 为 0.25,并且仅在未指定 window 时指定。

Savitzky-Golay 阶数,指定为非负整数。仅当指定的平滑处理方法为 'sgolay' 时,才能指定此名称-值参数。Degree 的值对应于 Savitzky-golay 滤波器中多项式的次数,该次数适合每个窗口内的数据,默认为 2。

对于均匀样本点,Degree 的值必须小于窗口长度。对于非均匀样本点,该值必须小于任意窗口中的最大点数。

输出参数

全部折叠

经过平滑处理的数据,以向量、矩阵、多维数组、表或时间表形式返回。

除非 ReplaceValues 的值为 false,否则 BA 的大小相同。如果 ReplaceValues 的值是 false,则 B 的宽度是输入数据宽度和指定的数据变量数目之和。

窗长度,以正整数标量、由正整数组成的二元素向量、正持续时间标量或由正持续时间组成的二元素向量形式返回。

window 指定为输入参数时,输出值与输入值匹配。当 window 未指定为输入参数时,其值是由 smoothdata 基于输入数据启发性确定的标量。

算法

当没有为平滑处理方法指定窗口大小时,smoothdata 将基于启发式算法计算默认窗口大小。对于平滑处理因子 τ,启发式算法将估算其衰减量大约为输入数据能量的 100*τ% 的移动平均窗口大小。

扩展功能

版本历史记录

在 R2017a 中推出

全部展开