Documentation

### This is machine translation

Translated by
Mouseover text to see original. Click the button below to return to the English version of the page.

# smooth

Smooth response data

## Syntax

```yy = smooth(y) yy = smooth(y,span) yy = smooth(y,method) yy = smooth(y,span,method) yy = smooth(y,'sgolay',degree) yy = smooth(y,span,'sgolay',degree) yy = smooth(x,y,...) gpuarrayYY = smooth(gpuarrayY) ```

## Description

`yy = smooth(y)` smooths the data in the column vector `y` using a moving average filter. Results are returned in the column vector `yy`. The default span for the moving average is `5`.

The first few elements of `yy` are given by

```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 ...```

Because of the way endpoints are handled, the result differs from the result returned by the `filter` function.

`yy = smooth(y,span)` sets the span of the moving average to `span`. `span` must be odd.

`yy = smooth(y,method)` smooths the data in `y` using the method `method` and the default span. Supported values for `method` are listed in the table below.

`method`

Description

`'moving'`

Moving average (default). A lowpass filter with filter coefficients equal to the reciprocal of the span.

`'lowess'`

Local regression using weighted linear least squares and a 1st degree polynomial model

`'loess'`

Local regression using weighted linear least squares and a 2nd degree polynomial model

`'sgolay'`

Savitzky-Golay filter. A generalized moving average with filter coefficients determined by an unweighted linear least-squares regression and a polynomial model of specified degree (default is 2). The method can accept nonuniform predictor data.

`'rlowess'`

A robust version of `'lowess'` that assigns lower weight to outliers in the regression. The method assigns zero weight to data outside six mean absolute deviations.

`'rloess'`

A robust version of `'loess'` that assigns lower weight to outliers in the regression. The method assigns zero weight to data outside six mean absolute deviations.

`yy = smooth(y,span,method)` sets the span of `method` to `span`. For the `loess` and `lowess` methods, `span` is a percentage of the total number of data points, less than or equal to 1. For the moving average and Savitzky-Golay methods, `span` must be odd (an even `span` is automatically reduced by `1`).

`yy = smooth(y,'sgolay',degree)` uses the Savitzky-Golay method with polynomial degree specified by `degree`.

`yy = smooth(y,span,'sgolay',degree)` uses the number of data points specified by `span` in the Savitzky-Golay calculation. `span` must be odd and `degree` must be less than `span`.

`yy = smooth(x,y,...)` additionally specifies `x` data. If `x` is not provided, methods that require `x` data assume ```x = 1:length(y)```. You should specify `x` data when it is not uniformly spaced or sorted. If `x` is not uniform and you do not specify `method`, `lowess` is used. If the smoothing method requires `x` to be sorted, the sorting occurs automatically.

`gpuarrayYY = smooth(gpuarrayY)` performs the operation on a GPU. The input `gpuarrayY` is a gpuArray column vector. The output `gpuarrayYY` is a gpuArray column vector. This syntax requires the Parallel Computing Toolbox™.

### Note

You can use gpuArray `x` and `y` inputs with the smooth function, but this is only recommended with the default `'method', 'moving'`. Using GPU data with other methods does not offer any performance advantage.

## Examples

collapse all

Smooth data by linear index and by each column separately, using a moving average filter. Plot and compare the results.

Load the data in `count.dat`. The 24-by-3 array `count` contains traffic counts at three intersections for each hour of the day.

`load count.dat`

Use a moving average filter with a 5-hour span to smooth all the data simultaneously (by linear index).

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

Use the same filter to smooth each column of the data separately.

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

Plot the original data and the data smoothed by linear index and by each column separately. Then, plot the difference between the two smoothed data sets. The two methods give different results near the endpoints.

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

Plot and compare the results of data smoothed using the `loess` and `rloess` methods. Then determine which method is less sensitive to outliers.

Create noisy data with two outliers.

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

Smooth the data with the `loess` and `rloess` methods using a span of 10% of the total number of data points.

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

Plot the original and smoothed data. The outliers have less influence with the robust method.

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

## Tips

Another way to generate smoothed data is to fit it with a smoothing spline. Refer to the `fit` function for more information.