在R中将矩阵强制转换为整数矩阵的最快方法

lat*_*ian 5 performance r matrix

我刚刚意识到如果你创建一个带有整数值的矩阵,它们就会被存储为数字.

a <- matrix(c(0,1,0,1), ncol=2)
class(a[1,]) # numeric
Run Code Online (Sandbox Code Playgroud)

整数矩阵需要一半的内存量(对于大尺寸).以下函数将所有值强制转换为整数:

forceMatrixToInteger <- function(m){
    apply (m, c (1, 2), function (x) {
         (as.integer(x))
    })
}

a <- forceMatrixToInteger(a)

class(a[1,]) # integer
Run Code Online (Sandbox Code Playgroud)

我想知道你是否可以想到任何其他方法来做到这一点,以及它是否会更快或更高效.

sessionInfo

R version 3.2.3 (2015-12-10)
Platform: x86_64-apple-darwin13.4.0 (64-bit)
Running under: OS X 10.11.3 (El Capitan)
Run Code Online (Sandbox Code Playgroud)

编辑:第一次测试

我定义了一个函数,它执行Richard Scriven回答描述的函数,以及我定义的函数和测试速度.

exp_size <- 4
exp_reps <- 3 
mat <- matrix(sample(c(0,1), 10^exp_size, replace=TRUE),ncol=10^(exp_size/2))

fun1<-function(){
    mode(mat) <- 'integer'
}

time <- proc.time()
    for (i in 1:10^exp_reps){
    fun1()
}
time <- proc.time()-time
print('Results fun1:')
print(time)

 print(time)
 # user  system elapsed 
 # 0.096   0.035   0.132 

fun2 <- function(){
    apply (mat, c (1, 2), function (x) {
         (as.integer(x))
    })
}

time <- proc.time()
for (i in 1:10^exp_reps){
    fun2()
}
time <- proc.time()-time
print('Results fun2:')
print(time)

# user  system elapsed 
# 22.592   0.148  22.775 
Run Code Online (Sandbox Code Playgroud)

有一个明显的赢家.

Ric*_*ven 11

如果你这样做c(0, 1, 0, 1),似乎你会创建整数,但实际上你正在创建一个双精度矢量.对于你必须使用的整数c(0L, 1L, 0L, 1L),或者rep(0:1, 2)(因为:创建一个整数向量).要将矩阵更改为整数,可以更改其内部存储模式.

a <- matrix(c(0,1,0,1), ncol=2)
object.size(a)
# 232 bytes
mode(a) <- "integer"
object.size(a)
# 216 bytes
Run Code Online (Sandbox Code Playgroud)

我不知道它有多快,但它很容易.

  • `mode(a) &lt;- "integer"` 让我很开心! (3认同)