Skip to content
Prev 369556 / 398503 Next

Reversing one dimension of an array, in a generalized case

And my 2 cents,

Rev <- function(x, margin) {
    newdim <- rep("", length(dim(x)))
    newdim[margin] <- paste(dim(x), ":1", sep = "")[margin]
    z <- eval(parse(text = gettextf("x[%s,drop = F]", paste(newdim, sep = "",
                                                            collapse = ","))))
    class(z) <- oldClass(x)
    return(z)
}

z <- array(1:24,dim=2:4)
dim(f(z, 3)) # 2 3 4
dim(f2(z, 3)) # 3 4 2
dim(Rev(z, 3)) # 2 3 4
dim(revdim(z,3)) # 2 3 4

microbenchmark::microbenchmark(f(z, 3), Rev(z, 3), revdim(z,3), f2(z,3))

Unit: microseconds
         expr     min       lq      mean   median       uq     max neval
      f(z, 3)   6.356   7.6090   9.74268   9.3285  11.2325  35.571   100
    Rev(z, 3) 161.079 166.9660 175.26906 172.1450 176.8130 273.078   100
 revdim(z, 3)   5.011   6.1300   7.88565   7.5695   9.0500  21.301   100
     f2(z, 3)  68.454  71.6815  82.85703  81.6700  87.9285 126.496   100

and strangely,

all.equal(f(z, 3), Rev(z, 3), revdim(z,3), f2(z,3))
[1] TRUE

?