【问题标题】:Use max on each element of a matrix对矩阵的每个元素使用 max
【发布时间】:2013-05-22 16:06:01
【问题描述】:
> x <- array(-10:10, dim=c(4,5))
> x
     [,1] [,2] [,3] [,4] [,5]
[1,]  -10   -6   -2    2    6
[2,]   -9   -5   -1    3    7
[3,]   -8   -4    0    4    8
[4,]   -7   -3    1    5    9

如何将“max(x, 0)”应用于每个元素,以便得到这个矩阵:

     [,1] [,2] [,3] [,4] [,5]
[1,]    0    0    0    2    6
[2,]    0    0    0    3    7
[3,]    0    0    0    4    8
[4,]    0    0    1    5    9

【问题讨论】:

    标签: r matrix max


    【解决方案1】:

    使用pmax:

    pmax(x,0)
    #     [,1] [,2] [,3] [,4] [,5]
    #[1,]    0    0    0    2    6
    #[2,]    0    0    0    3    7
    #[3,]    0    0    0    4    8
    #[4,]    0    0    1    5    9
    

    【讨论】:

    • 这对我不起作用。我做了&gt; x=read.csv(...) &gt; x2 = sapply(data,atanh) &gt; pmax(x2,-20) 但这产生了-20 的向量,而不是原始维度的矩阵。 (请注意 &gt; class(x2) [1] "matrix" 尽管 &gt; class(x) [1] "data.frame")@Chase 他的解决方案确实有效。
    • @TimKuipers pmax 保留对象的 dim - 您可能遗漏了一个步骤,或者您的 x2 不是矩形
    • 啊不。我犯的错误是,由于我的矩阵非常大,我尝试通过x2[1:10] 而不是x2[1:10,] 只查看其中的一部分。对不起!
    • @TimKuipers np,很高兴你知道了
    【解决方案2】:

    你可以直接使用R的索引函数[来做到这一点:

    x <- array(-10:10, dim=c(4,5))
    x[x < 0] <- 0
    

    这是因为x &lt; 0 创建了一个逻辑矩阵输出:

    x < 0
    
         [,1] [,2]  [,3]  [,4]  [,5]
    [1,] TRUE TRUE  TRUE FALSE FALSE
    [2,] TRUE TRUE  TRUE FALSE FALSE
    [3,] TRUE TRUE FALSE FALSE FALSE
    [4,] TRUE TRUE FALSE FALSE FALSE
    

    得到的矩阵是:

         [,1] [,2] [,3] [,4] [,5]
    [1,]    0    0    0    2    6
    [2,]    0    0    0    3    7
    [3,]    0    0    0    4    8
    [4,]    0    0    1    5    9
    

    这两种方法之间的时间惊人地相似。这是一个更大的示例,说明了可比较的时间:

    xbigC <- xbigE <- matrix(sample(-100:100, 1e8, TRUE), ncol = 1e4)
    system.time(xbigC[xbigC < 0] <- 0)
     #--- 
      user  system elapsed 
       4.56    0.37    4.93 
    system.time(xbigE  <- pmax(xbigE,0))
    #---
       user  system elapsed 
       4.10    0.51    4.62 
    all.equal(xbigC, xbigE)
    #---
    [1] TRUE
    

    【讨论】:

    • @ManInMoon - 是的,不用担心。直接索引方法将更加灵活,因为您可以使用其他逻辑运算符创建更复杂的条件。对于这项任务,pmax() 似乎效率稍高一些。
    【解决方案3】:

    似乎pmax() 的参数顺序会影响输入为矩阵时返回的类:

    pmax(0,x)
    [1] 0 0 0 0 0 0 0 0 0 0 0 1 2 3 4 5 6 7 8 9
    
    pmax(x,0)
         [,1] [,2] [,3] [,4] [,5]
    [1,]    0    0    0    2    6
    [2,]    0    0    0    3    7
    [3,]    0    0    0    4    8
    [4,]    0    0    1    5    9
    

    【讨论】:

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