3

我有一个 4 维数组,我想用作为输入函数的值填充插槽。通过搜索这里的论坛,我发现函数“outer”对 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.
      }   
    }
  }
}

预先感谢您的任何帮助。

4

1 回答 1

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 和值的 data.frame 或矩阵,则可以使用: K[cbind(index-vectors)] <- values 构造:

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
于 2012-05-14T19:07:18.697 回答