【问题标题】:MATLAB smooth function in RR中的MATLAB平滑函数
【发布时间】: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) 或 eve y(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


【解决方案1】:

在 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

【讨论】:

  • 非常感谢!我将研究这个函数以了解你是如何做到的,但这会返回相同的值!
猜你喜欢
  • 2017-09-28
  • 1970-01-01
  • 2018-07-08
  • 2011-02-15
  • 2011-09-11
  • 1970-01-01
  • 2022-10-12
  • 2023-03-22
  • 1970-01-01
相关资源
最近更新 更多