每行减去最大值

时间:2018-11-08 13:52:29

标签: r matrix max vectorization

假设您要从相应行中减去矩阵每一行的最大值。您可以使用这样的循环来做到这一点:

# create matrix
mat <- matrix(rnorm(100),ncol=5,nrow=20)

for(i in 1:nrow(mat)){    #for each row
  row.max <- max( mat[i,] ) #take the maximum of the row
  mat[i,] <- mat[i,] - row.max  #subtract it from the row
}

我正在考虑一种矢量化的方式,也许使用max.col(),但是到目前为止,我还无法提出一些建议。有什么想法吗?

谢谢!

编辑:

感谢您的回答,我接受了(到目前为止)最快的解决方案。

Unit: microseconds
    expr      min        lq       mean    median        uq       max neval
    loop 4671.687 4906.6820 5124.78995 5019.7965 5214.5935 12318.986   100
   apply   41.055   47.0430   60.58208   57.0925   71.6320   158.661   100
 rowMaxs    2.139    2.9945    6.21019    5.3465    8.9810    12.402   100
 do.call  111.618  125.0890  154.46904  142.4095  170.2065   422.522   100

3 个答案:

答案 0 :(得分:6)

您可以使用library(matrixStats)并只需使用

mat - rowMaxs(mat)

matrixStats行中可以看出,该解决方案非常快。(基准测试由 @hrbrmstr 提供)

## Unit: microseconds
##         expr     min       lq      mean   median       uq      max neval
##     base_mat  33.084  39.3215  46.93637  46.3575  49.6435  116.293   100
##      base_df  80.769  98.9870 116.05771 112.8985 127.6595  201.791   100
##  matrixStats   2.111   3.0170   4.99795   4.9655   5.8415   27.240   100
##    qlcMatrix 716.229 742.2140 834.73351 782.1605 888.4960 1491.734   100

答案 1 :(得分:2)

基本R选项为

mat - do.call(pmax, data.frame(mat))

 #           [,1]       [,2]       [,3]       [,4]       [,5]
 #[1,] -2.6565620 -1.9266890 -1.3154080 -0.3471987  0.0000000
 #[2,]  0.0000000 -1.2758157 -0.7681151 -0.7530223 -1.3460720
 #[3,]  0.0000000 -1.8606951 -1.5249890 -1.7938812 -1.9398058
 #[4,] -2.8052871 -0.3951306  0.0000000 -0.9608475 -0.7402124
 #[5,] -0.5303694  0.0000000 -1.6532143 -2.5885875 -1.9538341
 #[6,]  0.0000000 -0.6163414 -1.9542608 -1.6736752 -1.4745702
 #[7,] -1.1494957 -1.0857652  0.0000000 -2.7547954 -1.6820739
 #[8,]  0.0000000 -0.3645636 -0.4770239 -0.7943613 -0.7053540
 #[9,] -0.5493137 -0.8220334  0.0000000 -0.2791556 -0.5086898
 #[10,] -3.3058730  0.0000000 -3.3517838 -2.8817327 -2.9126851

数据

set.seed(1234)
mat <- matrix(rnorm(100),ncol=5,nrow=10)

答案 2 :(得分:0)

有一个名为qlcMatrix的程序包,它具有功能rowMax;colMax;rowMin;colMin

使用此软件包,您可以执行mat - rowMax(mat)形式的内容。