矩阵中值的乘法及其行号

时间:2013-09-25 14:41:45

标签: r

我有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.我应该如何实现这项工作?

3 个答案:

答案 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)