我在看三维数组M:M<-dim(3,3,3)
我想找到一种使用以下规则填充M的有效方法:
M [i,j,k] = i / 10 + j ^ 2 + sqrt(k),
理想情况下,无需使用for
statemenet编写循环。
为了澄清,如果M是二维的,有一种简单的方法可以实现这一点。如果我想拥有
M [i,j] = i / 10 + j ^ 2 ,
然后我就可以了
M<-row(M)/10 + col(M)*col(M)
是否存在与3维或更高维数列相同的东西?
答案 0 :(得分:7)
@詹姆斯的答案更好,但我认为对你的问题(多维等效的row()/col()
)的狭隘答案是slice.index
......
M<- array(dim=c(3,3,3))
slice.index(M,1)/10+slice.index(M,2)^2+sqrt(slice.index(M,3))
如果有人(我或其他人)在r-devel
列表上发布了一条建议,以slice.index
/ {{?row
上的“另请参阅”条目,那将是一个好主意。 1}} ...
或者(类似于@ flodel的新答案):
?col
答案 1 :(得分:4)
如何使用嵌套的outer
?
outer(1:3/10,outer((1:3)^2,sqrt(1:3),"+"),"+")
, , 1
[,1] [,2] [,3]
[1,] 2.1 5.1 10.1
[2,] 2.2 5.2 10.2
[3,] 2.3 5.3 10.3
, , 2
[,1] [,2] [,3]
[1,] 2.514214 5.514214 10.51421
[2,] 2.614214 5.614214 10.61421
[3,] 2.714214 5.714214 10.71421
, , 3
[,1] [,2] [,3]
[1,] 2.832051 5.832051 10.83205
[2,] 2.932051 5.932051 10.93205
[3,] 3.032051 6.032051 11.03205
答案 2 :(得分:2)
您还可以使用arrayInd
:
M <- array(dim = c(3, 3, 3))
foo <- function(dim1, dim2, dim3) dim1/10 + dim2^2 + sqrt(dim3)
idx <- arrayInd(seq_along(M), dim(M), useNames = TRUE)
M[] <- do.call(foo, as.data.frame(idx))
我觉得随着尺寸数量的增加,这种方法有可能减少打字。
答案 3 :(得分:1)
可以说是“从头开始”。
i <- rep(1:3, times=3*3)
j <- rep(1:3 , times= 3, each=3)
k <- rep(1:3 , each= 3*3)
M <- array( i/10 + j^2 + sqrt(k), c(3, 3, 3))
M