如何根据索引将函数应用于多维数组

时间:2012-05-14 13:48:35

标签: r multidimensional-array indices

我有一个4维数组,我想填充插槽的值是输入的函数。通过在这里搜索论坛,我发现函数“外部”对2x2矩阵很有用,但不能应用于一般的多维数组。有没有什么能比R代码更有效地实现这个目标?

K <- array(0,dim=c(2,2,2,2)) #dimensions will be much larger
for(x1 in 1:2)
{
  for(y1 in 1:2)
  {
    for(x2 in 1:2)
    {
      for(y2 in 1:2)
      {
        K[x1,y1,x2,y2] <- x1*y2 - sin(x2*y1) #this is just a dummy function.
      }   
    }
  }
}

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

编辑;这就是我认为更快的解决方案。它假定您提供了预定义的K.它使用K[] <-构造插入在数据框环境中计算的值。使用赋值的LHS上的方括号保留了K的结构,我认为它既是矢量化的又是自我记录的:

dfm <- expand.grid(x1=1:2,x2=1:2,y1=1:2,y2=1:2) 
K[] <- with(dfm, x1*y2 - sin(x2*y1 ) )

提供的第一个解决方案: 如果您可以创建具有索引x1,x2,y1,y2的数据框架或矩阵,则可以使用以下值:K [cbind(index-vectors)]&lt; - values construction:

mtx<- data.matrix( expand.grid(x1=1:2,x2=1:2,y1=1:2,y2=1:2) )
K[mtx] <- apply(mtx, 1, function(x) x["x1"]*x["y2"] - sin(x['x2']*x['y1']) )
#----------------
> K
, , 1, 1

        [,1]       [,2]
[1,] 0.158529 0.09070257
[2,] 1.158529 1.09070257

, , 2, 1

          [,1]     [,2]
[1,] 0.09070257 1.756802
[2,] 1.09070257 2.756802

, , 1, 2

        [,1]     [,2]
[1,] 1.158529 1.090703
[2,] 3.158529 3.090703

, , 2, 2

        [,1]     [,2]
[1,] 1.090703 2.756802
[2,] 3.090703 4.756802