【发布时间】:2021-05-08 00:00:06
【问题描述】:
我正在尝试在 R 中创建 MATLAB 平滑函数代码。
以下是MATLAB网站中函数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
...
以下是我构建的 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。
【问题讨论】:
-
y(1)或 evey(2)是什么?即y是什么? -
在 R 中,
y(1)表示y是一个函数。对不起。也许你应该改写y[1],但它很好 -
看看
filter()函数?它不会以相同的方式处理系列的结尾,但它可能已经足够好了...... -
您的
i循环毫无意义,因为当您生成输出时,您使用j索引作为output[j]。因此,在您的i循环的最后一步,由于您的数据中没有i+4(请记住,您的数据长度等于i),因此它会为您提供NA。然后再次使用j索引将NA值分配给输出。 -
一般来说,您应该尽量让您在 Stack Overflow 上的问题自成一体:只要有可能,人们就不必点击链接/转到另一个站点来理解您的问题...
标签: r matlab for-loop smoothing