【问题标题】:Given an element of a list, how do I recover its index inside the list?给定列表的一个元素,我如何在列表中恢复它的索引?
【发布时间】:2016-10-14 05:41:01
【问题描述】:

我的问题基本上是这样的:

我有一个列表 L,其中每个元素都是相同维度的矩阵。我需要将此列表中的每个矩阵乘以外部向量 h 中的对应元素,然后对所有矩阵求和。

set.seed(101)
L <- replicate(3, matrix(rnorm(4), 2), simplify = FALSE)
h <- 2:4

# I need this
L[[1]] * h[1] + L[[2]] * h[2] + L[[3]] * h[3]

鉴于我需要尝试不同数量的矩阵,而且我有很多矩阵,我必须以一种聪明的方式来做。我的想法是

L1 <- lapply(L, function(x) x * h[x])
L2 <- Reduce('+', L1)

其中 "h[x]" 将通过列表 L 中的矩阵 x 的索引来索引向量 h,所以我会得到

 L1 = list(L[[1]] * h[1], L[[2]] * h[2], L[[3]] * h[3])

那么,问题是,如何通过使用元素本身来获取列表中元素的索引?类似 h[L[[m1]]] 的东西可以得到 h[1]。

或者,如果您有任何其他方法可以解决我的问题,我该怎么做?

【问题讨论】:

  • 您能否通过给出示例矩阵 m1、m2、m3 来完成示例?
  • 下面 Ben Bolker 给出的例子有效

标签: r list indexing


【解决方案1】:

我认为您正在寻找mapply()/Map()Map 在这里稍微容易一些,因为它不会试图简化结果):

?Map:

'Map' 将函数应用于给定向量的相应元素......'Map' 是对'mapply' 的简单包装,它不会试图简化结果......

?mapply:

‘mapply’将‘FUN’应用于每个 ... 参数的第一个元素、第二个元素、第三个元素,依此类推

设置示例:

set.seed(101)
L <- replicate(3,matrix(rnorm(4),2),simplify=FALSE)
h <- 2:4

这样做:

Reduce("+",Map("*",L,h))

【讨论】:

    【解决方案2】:

    我可能会这样做

    Reduce(
      function(z,i) z + L[[i]]*h[i], 
      seq_along(L), 
      init = array(0, dim(L[[1]]))
    )
    

    在 Ben 的示例数据上进行测试,我看到了相同的结果,所以我猜它有效。

    这类似于an answer @eddi posted on my question about linear combos

    【讨论】:

      【解决方案3】:

      使用foreach包,我们可以得到如下结果:

      library(foreach)
      foreach(i=seq_along(h), .combine="+") %do% {
        L[[i]] * h[i]
      }
      

      %do% 循环执行逐元素乘法,然后使用.combine 参数对输出求和。这输出与 Ben 的 Map-Reduce 方法相同的结果。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-04-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多