我正在尝试在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