假设 X 是一个 D 维数组。
我想写一个有两个参数的函数:
foo<-function(X,d){
....
}
其中 foo 必须在 X 的第 d^th 维上运行。例如,提取 X 的第 d^th 维的元素。
如何做到这一点(我宁愿使用数组而不是列表)
假设 X 是一个 D 维数组。
我想写一个有两个参数的函数:
foo<-function(X,d){
....
}
其中 foo 必须在 X 的第 d^th 维上运行。例如,提取 X 的第 d^th 维的元素。
如何做到这一点(我宁愿使用数组而不是列表)
如果您的数组具有 D 维,则不能通过指定标量来引用单个维。相反,您需要提供一个维度向量。例如,如果您的数组是:
set.seet(123)
X <- array(data=rnorm(12),dim=c(2,2,3))
然后例如X[2]
会给你一个数组的单个元素。如果你尝试X[2,1]
,你会得到关于不正确的维数的错误。因此,获取整个维度的唯一选择是提供一个长度为 D 的向量,其中一个元素将为空,例如X[1,1,]
。这将为您提供数组的相应维度,在这个由 3 个元素组成的特定示例中,它对应于定义。
自然,其他(指定)尺寸可以在定义的边界内变化,例如X[1,2,]
。
看?apply
,这是一个简单的例子:
x = array(c(1:8), dim = c(2,2,2))
#, , 1
#
# [,1] [,2]
#[1,] 1 3
#[2,] 2 4
#
#, , 2
#
# [,1] [,2]
#[1,] 5 7
#[2,] 6 8
apply(x, 3, sum)
#[1] 10 26
以下是我最终解决它的方法:目标是找到一种apply()
用 a无缝替换 a 的标准方法lapply()
(因为后者可以很容易地并行化)。这是一个简单的例子apply()
#data
n<-10
p<-5
k<-15
x<-array(rnorm(n*p*k),dim=c(n,p,k))
fx01<-function(ll,x,d0,dm,fun1){
dm[[d0]]<-ll
gotfun<-get(fun1)
gotfun(x[dm[[1]],dm[[2]],dm[[3]]])
}
#housekeeping:
d0<-3
lx<-length(dim(x))
dm<-vector("list",lx)
for(i in 1:lx) dm[[i]]<-1:dim(x)[i]
#the actual computations:
res<-lapply(1:dim(x)[d0],fx01,x=x,d0=d0,dm=dm,fun1="mean")
c(res,recursive=TRUE)
#compare with the real thing:
apply(x,d0,mean)