0

假设 X 是一个 D 维数组。

我想写一个有两个参数的函数:

foo<-function(X,d){
   ....
}

其中 foo 必须在 X 的第 d^th 维上运行。例如,提取 X 的第 d^th 维的元素。

如何做到这一点(我宁愿使用数组而不是列表)

4

3 回答 3

1

如果您的数组具有 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,]

于 2013-04-24T19:13:46.903 回答
0

?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
于 2013-04-24T19:28:07.757 回答
0

以下是我最终解决它的方法:目标是找到一种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) 
于 2013-04-26T21:17:05.073 回答