如何构建更复杂的矢量化操作?

时间:2013-11-09 00:54:12

标签: r vector

我有一个由prcomp计算的主成分旋转向量的子列表,其中每个列表项是Nx2数组(即两个列向量),用于每个类。

使用这些向量,我想将类似结构的一些数据投影到一个类列表中,每个类项包含维度为NxMxT的数组,其中T是试验次数。

我的问题是,我可以使用apply及其变体编写简单的矢量化函数,但是我无法将其概括为将其应用于每个列表。

示例数据:

somedata <- list(array(rnorm(100),dim=c(5,4,5)),array(rnorm(100),dim=c(5,4,5)))
somevectors <- list(array(rnorm(10),dim=c(5,2)),array(rnorm(10),dim=c(5,2)))

以下是对每个列表元素的操作的简单示例:

o.proj.1 <- apply(somedata[[1]],3,function(x){
    t(somevectors[[1]]) %*% x
  }) # returns an array where each projected trial is a column

我尝试在调用lapply()时调整此内容,但没有取得多大成功:

lapply(somedata, y = somevectors, function(x,y){
  apply(x,3,function(z){
    t(y) %*% z
  })
})

Error in t(y) %*% z : requires numeric/complex matrix/vector arguments

基本上我的算法是将相应的apply类型(此处为lapply)放在更多本地函数周围,并删除将被矢量化的索引(此处为[[]])。我错过了什么?

1 个答案:

答案 0 :(得分:2)

*apply函数族中,mapply是您想要在两个或多个对象上同时循环时使用的函数。尝试:

o.proj <- mapply(function(x,y){
  apply(x,3,function(z){
    t(y) %*% z
  })
}, somedata, somevectors, SIMPLIFY = FALSE)

我想您会希望使用SIMPLIFY = FALSE来返回列表,否则mapply会尝试将输出简化为数组,有点像sapply

另请注意,您可以使用Map作为mapply(..., SIMPLIFY = FALSE)的快捷方式。