Main Content

本页翻译不是最新的。点击此处可查看最新英文版本。

smoothdata

对含噪数据进行平滑处理

说明

示例

B = smoothdata(A) 使用移动平均值对 A 的条目进行平滑处理。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") 使用萨维茨基-戈雷滤波器对 A 中的数据进行平滑处理。

示例

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

示例

B = smoothdata(___,nanflag) 指定忽略还是包括 A 中的 NaN 值。例如,进行平滑处理时,smoothdata(A,"includenan") 包括所有 NaN 值。默认情况下,smoothdata 忽略 NaN 值。

示例

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

示例

[B,winsize] = smoothdata(___) 还会返回移动窗大小。

示例

全部折叠

创建含有含噪数据的向量,并使用移动平均值对数据进行平滑处理。

x = 1:100;
rng(0,"twister")
A = cos(2*pi*0.05*x+2*pi*rand) + 0.5*randn(1,100);

B = smoothdata(A);

绘制原始数据和经过平滑处理的数据。

plot(x,A)
hold on
plot(x,B)
legend("Input Data","Smoothed Data")

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

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

x = 1:100;
rng(0,"twister")
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,:))
hold on
plot(x,B(2,:))
plot(x,B(3,:))
legend("s1","s2","s3")

Figure contains an axes object. The axes object contains 3 objects of type line. These objects represent s1, s2, s3.

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

x = 1:100;
rng(0,"twister")
A = cos(2*pi*0.05*x+2*pi*rand) + 0.5*randn(1,100);

[B,winsize] = smoothdata(A,"gaussian");
winsize
winsize = 4

用包含 20 个元素的较大窗对原始数据进行平滑处理。绘制两种窗大小的平滑数据。

C = smoothdata(A,"gaussian",20);
plot(x,B)
hold on
plot(x,C)
legend("Small Window","Large Window")

Figure contains an axes object. The axes object contains 2 objects of type line. These objects represent Small Window, Large Window.

创建一个包含 NaN 值的含噪向量,对数据进行平滑处理并忽略 NaN 值。

rng(0,"twister")
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")
hold on
plot(1:100,C,"-x")
legend("Ignore Missing","Include Missing")

Figure contains an axes object. The axes object contains 2 objects of type line. These objects represent Ignore Missing, Include Missing.

创建对应于时间向量 t 的含噪数据的向量。相对于 t 中的时间对数据进行平滑处理,并绘制原始数据和经过平滑处理的数据图。

x = 1:100;
rng(0,"twister")
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)
hold on
plot(t,B)
legend("Input Data","Smoothed Data")

Figure contains an axes object. The axes object contains 2 objects of type line. These objects represent Input 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" - 萨维茨基-戈雷滤波器,它根据在 A 的每个窗上拟合的二次多项式进行平滑处理。当数据变化很快时,此方法可能比其他方法更有效。

窗大小,指定为正整数或 duration 标量或非负整数或 duration 值的二元素向量。smoothdata 定义相对于样本点的窗。

  • window 是正整数标量时,则窗的长度为 window,并且以当前元素为中心。

  • window 是非负整数 [b f] 的二元素向量时,窗包含当前元素、b 之前的元素和 f 之后的元素。

A 是时间表或 SamplePoints 包含 datetimeduration 值时,window 的类型必须为 duration

有关窗位置的详细信息,请参阅移动窗大小

示例: smoothdata(A,"movmean",4)

示例: smoothdata(A,"movmedian",[2 3])

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

  • "omitmissing""omitnan" - 进行平滑处理时忽略 A 中的 NaN 值。如果窗中的所有元素均为 NaN,则 B 中对应的元素是 NaN"omitmissing""omitnan" 具有相同的行为。

  • "includemissing""includenan" - 进行平滑处理时包括 A 中的 NaN 值。如果窗中有任一元素为 NaN,则 B 中对应的元素为 NaN"includemissing""includenan" 具有相同的行为。

名称-值参数

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

示例: smoothdata(A,SmoothingFactor=0.5)

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

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

数据选项

全部折叠

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

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

索引方案示例

变量名称:

  • 字符串标量或字符向量

  • "A"'A' - 名为 A 的变量

变量索引:

  • 引用变量在表中位置的索引编号

  • 逻辑向量。通常,此向量的长度与变量的数目相同,但可以省略尾部的 0false

  • 3 - 表中的第三个变量

  • [false false true] - 第三个变量

函数句柄:

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

  • @isnumeric - 一个包含数值的变量

变量类型:

  • 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 指定的其他变量会传递给输出,而不会对其进行平滑处理。

索引方案示例

变量名称:

  • 字符串、字符向量或元胞数组

  • pattern 对象

  • "A"'A' - 名为 A 的变量

  • ["A","B"]{'A','B'} - 两个名为 AB 的变量

  • "Var"+digitsPattern(1) - 变量名为 "Var" 后跟一个数字

变量索引:

  • 引用变量在表中位置的索引编号

  • 由数字组成的向量

  • 逻辑向量。通常,此向量的长度与变量的数目相同,但可以省略尾部的 0false

  • 3 - 表中的第三个变量

  • [2 3] - 表中的第二个和第三个变量

  • [false false true] - 第三个变量

函数句柄:

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

  • @isnumeric - 所有包含数值的变量

变量类型:

  • vartype 下标,用于选择指定类型的变量

  • vartype("numeric") - 所有包含数值的变量

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

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

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

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

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

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

平滑处理选项

全部折叠

窗口大小因子,指定为范围从 0 到 1 的标量。通常,smoothdata 根据 A 中的条目确定的窗大小,而 SmoothingFactor 通过缩放窗大小来调整平滑级别。接近 0 的值会产生较小的移动窗大小,从而导致较少的平滑处理。接近 1 的值会产生较大的移动窗大小,从而导致较多的平滑处理。在某些情况下,根据 smoothdata 用于确定窗大小的条目,SmoothingFactor 的值可能不会对窗大小产生显著影响。

SmoothingFactor 默认为 0.25。当不指定 window 时,只能指定 SmoothingFactor

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

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

输出参量

全部折叠

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

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

窗大小,以正整数或 duration 标量或非负整数或 duration 值的二元素向量形式返回。

如果指定 window 作为输入参量,则 winsizewindow 相同。如果不指定 window 作为输入参量,则 smoothdata 根据 A 中的条目确定窗大小。

详细信息

全部折叠

移动窗大小

下表说明默认等间距样本点向量 [1 2 3 ...] 上的窗位置。

描述

窗大小和位置

窗中的样本点

对于标量窗大小,包括窗的左边界,不包括窗的右边界。

window = 3

当前样本点 = 4

3、4、5

Given elements 1 to 7, if the current sample point is 4, then the corresponding window spans the range [2.5, 5.5).

window = 4

当前样本点 = 4

2、3、4、5

Given elements 1 to 7, if the current sample point is 4, then the corresponding window spans the range [2, 6).

对于向量窗大小,包括窗的左边界和右边界。

window = [2 2]

当前样本点 = 4

2、3、4、5、6

Given elements 1 to 7, if the current sample point is 4, then the corresponding window spans the range [2, 6].

对于输入数据端点附近的样本点,这些移动统计平滑方法会截断窗,使其从第一个样本点开始或在最后一个样本点结束。

  • "movmean"

  • "movmedian"

  • "gaussian"

window = [2 2]

当前样本点 = 2

1、2、3、4

Given elements 1 to 7, if the current sample point is 2, then the corresponding window spans the range [1, 4].

对于输入数据端点附近的样本点,这些局部回归平滑方法会移动窗以包含第一个或最后一个样本点。

  • "lowess"

  • "lowess"

  • "rlowess"

  • "rloess"

  • "sgolay"

window = [2 2]

当前样本点 = 2

1、2、3、4、5

Given elements 1 to 7, if the current sample point is 2, then the corresponding window spans the range [1, 5].

算法

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

扩展功能

版本历史记录

在 R2017a 中推出

全部展开