【问题标题】:avoiding loops and multiply lists with matrices elements避免循环并将列表与矩阵元素相乘
【发布时间】:2016-06-07 09:18:54
【问题描述】:

我正在处理一些列表和矩阵,但在正确处理数据时遇到了一些问题。假设我定义了以下矩阵和列表(仅作为示例):

m1 <-array(rexp(5),dim=c(3,3,3))
mn <-apply(m1,1:2,mean)   
ms <-apply(m1,1:2,sum)
msqr <-apply(ms,1:2,sqrt)
list1 <- list(mn,ms)
list2 <- list(ms,msqr)

然后,我想从 m1(具有不同维度)中减去 mn,但要避免循环。我的意思是,到目前为止,我正在做类似的事情:

dif <- array(NA,dim=c(3,3,3))
      for(i in 1:3){
        for(j in 1:3){
         dif[i,j,]<- m1[i,j,]-mn[i,j]
         }
        }

另一方面,我想将两个列表相乘:list1 和 list2(逐个元素),以获得另一个具有相同数量元素的 list3。 我正在尝试使用 sapply..但我做得不好..我想我可以在这两个示例中使用一些功能(mapply 或 sapply),但我看不出如何..有什么建议吗?

谢谢!

【问题讨论】:

  • Map('*', list1, list2) 你的第二个问题

标签: r


【解决方案1】:

对于第一部分,我们可以复制“mn”值以创建与“m1”大小相同的array,然后进行元素减法

dif1 <- m1-array(rep(mn, dim(m1)[3]), dim(m1))
identical(dif, dif1)
#[1] TRUE

对于第二种情况,mapply 可用于在 lists 的对应元素之间进行乘法运算。

mapply(`*`, list1, list2, SIMPLIFY = FALSE)

或者我们unlistlists,做*然后relist

relist(unlist(list1) * unlist(list2), skeleton = list1)

【讨论】:

  • 太棒了!这很有效,我喜欢第一种避免循环的方法,非常感谢。
猜你喜欢
  • 2022-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多