本页对应的英文页面已更新,但尚未翻译。 若要查看最新内容,请点击此处访问英文页面。

smoothdata

对含噪数据进行平滑处理

说明

示例

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

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

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

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

示例

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

示例

B = smoothdata(___,method) 为上述任一语法指定平滑处理方法。例如,B = 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')

创建一个矩阵,其中的行表示三个噪声信号。使用移动平均值对三个信号进行平滑处理,并绘制经过平滑处理的数据。

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

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

创建对应于时间向量 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 是表或时间表,则变量必须为数值,或者您必须使用 'DataVariables' 名称-值对组显式列出数值变量。当使用同时包含非数值变量的表时,指定变量很有用。

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

复数支持:

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

假设有一个矩阵 A

B = smoothdata(A,1)A 中的每列数据进行平滑处理。

B = smoothdata(A,2)A 中的每行数据进行平滑处理。

A 为表或时间表时,不支持 dimsmoothdata 分别对每个表或时间表变量进行运算。

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

平滑处理方法,指定为以下选项之一:

  • '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,并相对于样本点计算窗口。

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

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

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

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

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

名称-值对组参数

指定可选的、以逗号分隔的 Name,Value 对组参数。Name 为参数名称,Value 为对应的值。Name 必须放在引号中。您可采用任意顺序指定多个名称-值对组参数,如 Name1,Value1,...,NameN,ValueN 所示。

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

窗口大小因子,指定为以逗号分隔的对组,包含 'SmoothingFactor' 和一个 0 到 1 之间的标量。'SmoothingFactor' 的值通过缩放启发式窗口大小,调整平滑处理的级别。接近 0 的值会产生较小的移动窗口长度,从而导致较少的平滑处理。接近 1 的值会产生较大的移动窗口长度,从而促成较多的平滑处理。

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

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

样本点,指定为逗号分隔的对组,其中包含 'SamplePoints' 和一个向量。样本点表示数据在 A 中的位置。样本点不需要均匀采样。默认情况下,样本点向量是 [1 2 3 ...]

移动窗口相对于样本点定义,样本点必须已排序并且包含唯一的元素。例如,如果 t 是与输入数据对应的时间向量,则 smoothdata(rand(1,10),3,'SamplePoints',t) 将有一个代表 t(i)-1.5t(i)+1.5 之间时间间隔的窗口。

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

当输入数据为时间表时,不支持此名称-值对组。

数据类型: double | single | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | datetime | duration

表变量,指定为逗号分隔的对组,其中包含 'DataVariables' 和一个变量名称、变量名称元胞数组、数值向量、逻辑向量或函数句柄。'DataVariables' 值指示输入表的哪些列要平滑处理,可以是下列值之一:

  • 指定单个表变量名称的字符向量

  • 字符向量元胞数组,其中每个元素都是表变量名称

  • 表变量索引向量

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

  • 以表为输入并返回逻辑标量的函数句柄

示例: 'Age'

示例: {'Height','Weight'}

示例: @isnumeric

数据类型: char | cell | double | single | logical | function_handle

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

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

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

输出参数

全部折叠

输出数组,以向量、矩阵或多维数组的形式返回。B 的大小和类型均与 A 相同。

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

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

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

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

算法

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

扩展功能

在 R2017a 中推出