【问题标题】:Efficiently finding minimum cells values from a set of matrices in R有效地从 R 中的一组矩阵中​​找到最小单元格值
【发布时间】:2023-04-05 16:47:01
【问题描述】:

我有一个矩阵列表(大小为 n*n),我需要根据我的列表创建一个新矩阵,给出每个单元格观察到的最小值。

例如,使用以下矩阵列表:

> a = list(matrix(rexp(9), 3), matrix(rexp(9), 3), matrix(rexp(9), 3))
> a
[[1]]
          [,1]       [,2]       [,3]
[1,] 0.5220069 0.39643016 0.04255687
[2,] 0.4464044 0.66029350 0.34116609
[3,] 2.2495949 0.01705576 0.08861866

[[2]]
          [,1]     [,2]      [,3]
[1,] 0.3823704 0.271399 0.7388449
[2,] 0.1227819 1.160775 1.2131681
[3,] 0.1914548 1.004209 0.7628437

[[3]]
          [,1]       [,2]      [,3]
[1,] 0.2125612 0.45379057 1.5987420
[2,] 0.3242311 0.02736743 0.4372894
[3,] 0.6634098 1.15401347 0.9008529

输出应该是:

          [,1]       [,2]      [,3]
[1,] 0.2125612 0.271399 0.04255687
[2,] 0.1227819 0.02736743 0.34116609
[3,] 0.1914548 0.01705576 0.08861866

我尝试使用带有以下代码的应用循环(使用 reshape2 库中的 melt 和 dcast):

library(reshape2)
all = melt(a)
allComps = unique(all[,c(1:2)])
allComps$min=apply(allComps, 1, function(x){
  g1 = x[1]
  g2 = x[2]
  b = unlist(lapply(a, function(y){
    return(y[g1,g2])
  }))
  return(b[which(b==min(b))])
})
dcast(allComps, Var1~Var2) 

它可以工作,但是当应用于大型矩阵 (6000*6000) 时需要很长时间才能运行。我正在寻找一种更快的方法来做到这一点。

【问题讨论】:

    标签: r


    【解决方案1】:

    Reducepmin 一起使用:

    Reduce(pmin, a)
    
    #           [,1]       [,2]      [,3]
    #[1,] 0.02915345 0.03157736 0.3142273
    #[2,] 0.57661027 0.05621098 0.1452668
    #[3,] 0.48021473 0.18828404 0.4787604
    

    数据

    set.seed(123)
    a = list(matrix(rexp(9), 3), matrix(rexp(9), 3), matrix(rexp(9), 3))
    

    【讨论】:

    • 由于pmin不是二元函数,do.call(pmin, a)应该更高效
    【解决方案2】:

    也许应该考虑将矩阵存储在array而不是list。这可以通过simplify2array 完成。在array 中,可以在apply 中使用min 找到超过特定尺寸的最小值。

    A <- simplify2array(a)
    apply(A, 1:2, min)
    

    【讨论】:

      【解决方案3】:

      我们可以使用

      apply(array(unlist(a), c(3, 3, 3)), 1:2, min)
      

      【讨论】:

        猜你喜欢
        • 2020-11-29
        • 2018-12-25
        • 1970-01-01
        • 1970-01-01
        • 2012-02-09
        • 2022-01-15
        • 2011-06-07
        • 2021-11-04
        • 2020-05-09
        相关资源
        最近更新 更多