【问题标题】:Use lapply to multiply two lists of matrices in R使用 lapply 将 R 中的两个矩阵列表相乘
【发布时间】:2021-09-21 08:08:54
【问题描述】:

我有两个列表,每个列表都有很多矩阵。为简洁起见,下面是一个每个列表有两个矩阵的示例:

l1 <- list(matrix(1:20, nrow=2),
           matrix(21:40, nrow=2))

l2 <- list(matrix(41:60, nrow=2),
           matrix(61:80, nrow=2))

我正在尝试使用 lapply (a) 删除每个矩阵的第一列,然后 (b) 将 l1 中的每个矩阵与 l2 中的相应矩阵相乘。

首先,我试过了:

result <- lapply(l1, function(x,y){
  
  tmp <- x[,-1]*y[,-1]
  return(tmp)
  
}, y=l2)

没有用。问题是我无法以这种方式从l2 中删除第一列。如果l2 是一个向量而不是一个列表,那么代码将适用于tmp &lt;- x[,-1]*y[-1]。但即使我尝试简单地将每个列表中的矩阵相乘,它仍然不起作用:

result <- lapply(l1, function(x,y){
  
  tmp <- x*y
  return(tmp)
  
}, y=l2)

有什么想法吗?

【问题讨论】:

    标签: r list matrix lapply matrix-multiplication


    【解决方案1】:

    lapply 中,您只能迭代一个对象。你可以在这里使用Map -

    Map(function(x, y)  x[,-1]*y[,-1], l1, l2)
    
    #[[1]]
    #     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
    #[1,]  129  225  329  441  561  689  825  969 1121
    #[2,]  176  276  384  500  624  756  896 1044 1200
    
    #[[2]]
    #     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
    #[1,] 1449 1625 1809 2001 2201 2409 2625 2849 3081
    #[2,] 1536 1716 1904 2100 2304 2516 2736 2964 3200
    

    要使用lapply,您可以使用索引对l1l2 进行子集化。

    lapply(seq_along(l1), function(x) l1[[x]][, -1] * l2[[x]][, -1])
    

    【讨论】:

      【解决方案2】:

      使用map2

      library(purrr)
      map2(l1, l2, ~ .x[, -1] * .y[,-1])
      [[1]]
           [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
      [1,]  129  225  329  441  561  689  825  969 1121
      [2,]  176  276  384  500  624  756  896 1044 1200
      
      [[2]]
           [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
      [1,] 1449 1625 1809 2001 2201 2409 2625 2849 3081
      [2,] 1536 1716 1904 2100 2304 2516 2736 2964 3200
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-10-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多