0

我有 nX1 矩阵,例如这个:

[,1]
[1,]  480
[2,]  483
[3,]  480
[4,]  480

我想在这个矩阵上运行这个函数:

fun_window<-function(x)
{
  ((sin(n*pi)/length(datalist))^2*x;
  n<-n+1 
}

这里 n 是行号。在这个情况下:

480 * 1
483 * 2
480 * 3
480 * 4

我正在调用我的函数apply

s<-apply(df,2,FUN=fun_window)

但在我的 n 始终是 2。我应该如何执行这项工作?

4

3 回答 3

2

你不需要使用apply,因为sin它是矢量化的。此外,您可能想要sin(n*pi/length(datalist))而不是sin(n*pi)/length(datalist)因为如果n是整数则sin(n*pi)等于零。这就是我认为你想要的:

s<-df*sin((1:length(df))*pi/length(datalist))^2
于 2013-09-25T14:54:08.057 回答
1

尝试这个:

 datalist * row(datalist)
于 2013-09-25T16:47:10.803 回答
1

是什么datalist

无论如何,您实际上并不需要使用apply和单独的功能。您可以改为利用row函数和矢量化:

s <- (sin(row(x)*pi)/length(datalist))^2*x

row返回与其参数形状相同的矩阵,但每个单元格都替换为行号:

x
#      [,1]
# [1,]  480
# [2,]  483
# [3,]  480
# [4,]  480

row(x)
#      [,1]
# [1,]    1
# [2,]    2
# [3,]    3
# [4,]    4

在您的原始示例中,n由于范围限制,始终为 2:n分配给函数内部的值与n您在函数外部定义的值不同。该函数分配自己的版本,然后在函数返回时将其丢弃。您可以通过使用来解决这个问题<<-,但最好完全放弃该功能,以支持更安全、更简洁的方法。

于 2013-09-25T14:53:34.913 回答