Main Content

smooth

平滑响应数据

说明

示例

yy = smooth(y) 使用移动平均滤波器平滑处理列向量 y 中的响应数据。

yy 的前几个元素如下。

yy(1) = y(1)
yy(2) = (y(1) + y(2) + y(3))/3
yy(3) = (y(1) + y(2) + y(3) + y(4) + y(5))/5
yy(4) = (y(2) + y(3) + y(4) + y(5) + y(6))/5
...
由于 smooth 处理端点的方式,结果与 filter 函数返回的结果不同。

yy = smooth(y,span) 将移动平均值的跨度设置为 span

yy = smooth(y,method) 使用 method 指定的方法和默认 span 平滑处理 y 中的数据。

示例

yy = smooth(y,span,method)method 的跨度设置为 span

yy = smooth(y,'sgolay',degree) 使用萨维茨基-戈雷方法,多项式次数由 degree 指定。

yy = smooth(y,span,'sgolay',degree) 在萨维茨基-戈雷计算中使用 span 指定的数据点数。span 必须为奇数,并且 degree 必须小于 span

示例

yy = smooth(x,y,___) 指定自变量 x 的值。您可以将此语法与上述语法中的任何参量一起使用。

gpuarrayYY = smooth(gpuarrayY,___) 使用 gpuArray 数据在 GPU 上执行运算。您可以将 gpuArray 响应数据与所有上述语法结合使用。此语法需要 Parallel Computing Toolbox™。

gpuarrayYY = smooth(gpuarrayX,gpuarrayY,___) 使用 gpuArray 输入数据在 GPU 上执行运算。此语法需要 Parallel Computing Toolbox。

注意

仅当您使用默认方法 'moving' 时,才建议将 gpuArray xy 输入与 smooth 函数结合使用。通过其他方法使用 GPU 数据不会带来任何性能优势。

示例

全部折叠

使用移动平均滤波器,分别按线性索引和每列平滑处理数据。绘制并比较结果。

将数据加载到 count.dat 中。24×3 数组 count 包含三个十字路口在一天中每个小时的流量统计。

load count.dat

假设数据来自一个十字路口连续三天的流量统计。对所有数据一起进行平滑处理,就可以指示出通过十字路口的交通流量的整个周期。使用跨度为 5 小时的移动平均滤波器同时平滑处理所有数据(通过线性索引)。

c = smooth(count(:));
C1 = reshape(c,24,3);

然而,数据实际上来自三个不同十字路口。因此,按列平滑处理会给出一天中通过每个十字路口的更有意义的交通状况。使用相同的移动平均滤波器分别平滑处理每列数据。

C2 = zeros(24,3);
for I = 1:3
    C2(:,I) = smooth(count(:,I));
end

分别按线性索引和按每列绘制原始数据和平滑处理后的数据。然后,绘制两个经过平滑处理的数据集之间的差异。这两种方法在端点附近给出不同结果。

subplot(3,1,1)
plot(count,':');
hold on
plot(C1,'-');
title('Smooth C1 (All Data)')

subplot(3,1,2)
plot(count,':');
hold on
plot(C2,'-');
title('Smooth C2 (Each Column)')

subplot(3,1,3)
plot(C2 - C1,'o-')
title('Difference C2 - C1')

绘制并比较使用 loessrloess 方法平滑处理的数据结果。然后确定哪种方法对离群值更不敏感。

创建具有两个离群值的含噪数据。

x = (0:0.1:15)';
y = sin(x) + 0.5*(rand(size(x))-0.5);
y([90,110]) = 3;

使用 loessrloess 方法平滑处理数据。使用数据点总数的 10% 作为跨度。

yy1 = smooth(x,y,0.1,'loess');
yy2 = smooth(x,y,0.1,'rloess');

绘制原始数据和经过平滑处理的数据。使用稳健方法 rloess 时离群值的影响较小。

subplot(2,1,1)
plot(x,y,'b.',x,yy1,'r-')
set(gca,'YLim',[-1.5 3.5])
legend('Original data','Smoothed data using ''loess''',...
       'Location','NW')
   
subplot(2,1,2)
plot(x,y,'b.',x,yy2,'r-')
set(gca,'YLim',[-1.5 3.5])
legend('Original data','Smoothed data using ''rloess''',...
       'Location','NW')

输入参数

全部折叠

要平滑处理的数据,指定为列向量。

如果您的数据包含 NaN 并且您未指定 x,则您的数据被视为非均匀数据并使用 'lowess' 平滑方法。

数据类型: single | double

用于计算经过平滑处理的值的数据点数,指定为表示数据点总数一部分的整数或范围 (0,1) 内的标量值。

如果使用移动平均值或萨维茨基-戈雷方法,用于计算经过平滑处理的值的数据点数必须为奇数。如果将 span 指定为偶数或会产生偶数个数据点的小数,则 span 会自动减 1。

示例: 7; 0.6

平滑处理响应数据的平滑方法,指定为以下方法之一。

方法

描述

'moving'(默认值)

移动平均值。滤波器系数等于跨度倒数的低通滤波器。

'lowess'

使用加权线性最小二乘和一次多项式模型的局部回归。

'loess'

使用加权线性最小二乘和二次多项式模型的局部回归。

'sgolay'

萨维茨基-戈雷滤波器。具有由未加权线性最小二乘回归确定的滤波器系数和指定次数(默认值为 2)的多项式模型的广义移动平均值。该方法可以接受非均匀预测变量数据。

'rlowess'

'lowess' 的稳健版本,为回归中的离群值赋予较低的权重。该方法对六倍均值绝对偏差之外的数据赋予零权重。

'rloess'

'loess' 的稳健版本,为回归中的离群值赋予较低的权重。该方法对六倍均值绝对偏差之外的数据赋予零权重。

数据类型: char | string

萨维茨基-戈雷方法中使用的模型的多项式次数,指定为标量值。degree 必须小于 span

示例: 3

响应数据 y 的自变量,指定为列向量。如果不提供 x,则需要 x 的方法会假定 x = 1:length(y)。当 y 未排序或未按均匀间隔排列时,请指定 x 数据。如果 x 不均匀,并且您未指定 method,则函数使用 lowess。如果指定的平滑方法要求对 x 进行排序,则该函数会自动对 x 数据进行排序。

数据类型: single | double

要平滑处理的数据,指定为 gpuArray 列向量。

数据类型: single | double

响应数据 gpuarrayY 的输入数据,指定为 gpuArray 列向量。如果不提供 gpuarrayX,则需要 gpuarrayX 的方法会假定 gpuarrayX = 1:length(y)。当数据未按均匀间隔排列或未排序时,请指定 gpuarrayX 数据。如果 gpuarrayX 数据不均匀并且您未指定平滑方法,则使用 'lowess'。如果指定的平滑方法要求对 gpuarrayX 进行排序,则该函数会自动对 gpuarrayX 数据进行排序。

数据类型: single | double

输出参量

全部折叠

经过平滑处理的数据,以列向量形式返回。

经过平滑处理的数据,以 gpuArray 列向量形式返回。

提示

  • 您可以使用平滑样条生成对数据的平滑拟合。有关详细信息,请参阅 fit

替代功能

您也可以使用 MATLAB® smoothdata 函数来平滑处理数据。除了 GPU 数组支持之外,smoothdata 包括 smooth 函数的所有功能,还具有一些优势。与 smooth 不同,smoothdata 函数支持:

  • 矩阵、表和时间表

  • 移动中位数和高斯方法

  • 用于指定如何处理 NaN 值的选项

  • 用经过平滑处理的数据代换原始矩阵或将经过平滑处理的数据追加到原始矩阵的选项

  • tall 数组、C/C++ 代码生成和基于线程的环境

扩展功能

版本历史记录

在 R2006a 之前推出