给定列表的元素,如何在列表中恢复其索引?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了给定列表的元素,如何在列表中恢复其索引?相关的知识,希望对你有一定的参考价值。

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

我有一个列表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]”将向量h索引列表L内的矩阵x的索引,所以我会得到

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

那么,问题是,如何通过使用元素本身获取列表中元素的索引?像h [L [[m1]]]得到h [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))
另一答案

我可能会这样做

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

另一答案

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

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

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

以上是关于给定列表的元素,如何在列表中恢复其索引?的主要内容,如果未能解决你的问题,请参考以下文章

如何删除列表中列表中的第一个元素?

如何查找列表中所有唯一元素的所有索引[重复]

单词的压缩编码

820. 单词的压缩编码

LeetCode 39. 单词的压缩编码

leetcode 820. 单词的压缩编码(字典树)