Use max on each element of a matrix
You can use R's indexing function [
to do this directly:
x <- array(-10:10, dim=c(4,5))x[x < 0] <- 0
This works because x < 0
creates a logical matrix output:
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
And the resulting matrix is:
[,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
The timing between the two methods is surprisingly similar. Here's a larger example illustrating the comparable timings:
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