MATLAB在R中的光滑函数



我正在尝试在R.中创建MATLAB平滑函数代码

以下是MATLAB网站中函数平滑的计算:

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

以下是我构建的R代码:

ma <- function(data){
output <- vector(mode = "double", length = length(data))
for(i in 1:length(data)){
for(j in 1:length(output)){
if(j == 1){
output[j] <- data[1]
} else if(j == 2) {
output[j] <- (data[1] + data[2] + data[3])/3
} else if(j >= 3) {
output[j] <- (data[i] + data[i + 1] + data[i + 2] + data[i + 3] + data[i + 4])/5 
} 

}
}
output   
} 

我使用这个矢量进行测试:

n  = 1000
x  = seq(-pi, pi, length.out = n)
teste <- ma(x)

问题是:它只返回向量的前两个值。其他的都是NA

在R中实现这一点的一种方法是使用stats::convolve或使用stats::filter,两者都可以正常工作。

smooth <- function(y ){
h <- c(head(y, 1), mean(head(y, 3)))
t <- c(mean(tail(y, 3)), tail(y, 1))
m <- stats::convolve(y, rep(1/5, 5), type = "filter")
c(h, m, t)
}

例如:

R> y <- c(5, 3, 7, 10, 4, 9, 12, 2, 1, 5)
R> smooth(y)
[1] 5.000000 5.000000 5.800000 6.600000 8.400000 7.400000 5.600000 5.800000
[9] 2.666667 5.000000

MATLAB:

>> y = [5, 3, 7, 10, 4, 9, 12, 2, 1, 5]
>> smooth(y)
ans =
5.0000
5.0000
5.8000
6.6000
8.4000
7.4000
5.6000
5.8000
2.6667
5.0000

相关内容

  • 没有找到相关文章

最新更新