我有一个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.
}
}
}
}
提前感谢您的帮助。
答案 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