【问题标题】:How to build out more complex vectorized operations?如何构建更复杂的矢量化操作?
【发布时间】:2013-11-09 00:54:11
【问题描述】:

我有一个由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)放在更局部的函数周围,并删除将被矢量化的索引(此处为[[]])。我错过了什么?

【问题讨论】:

    标签: r vector


    【解决方案1】:

    *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) 的快捷方式。

    【讨论】:

    • 那么在迭代上下文中,mapplyxy 都在两个对象的相同第一个维度上进行迭代?即,x 对应于somedata[[n]]y 对应于somevectors[[n]] 在函数调用中的任何点?
    猜你喜欢
    • 2020-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-02
    • 1970-01-01
    相关资源
    最近更新 更多