我有nX1 Matrix例如这个:
[,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.我应该如何实现这项工作?
答案 0 :(得分: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
答案 1 :(得分: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
不同。该函数分配自己的版本,然后在函数返回时将其丢弃。你可以使用<<-
来解决这个问题,但最好不要完全放弃这个功能,而是采用更安全,更简洁的方法。
答案 2 :(得分:1)
试试这个:
datalist * row(datalist)