2016-04-29 2 views
2

整数値を持つ行列を作成すると、むしろ数値として格納されることに気付きました。行列を整数行列に強制的に変換する最速の方法R

a <- matrix(c(0,1,0,1), ncol=2) 
class(a[1,]) # numeric 

整数の行列は、(大規模の場合)メモリの半分の量を必要とします。

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

a <- forceMatrixToInteger(a) 

class(a[1,]) # integer 

私はあなたがこれを行うには、他の方法を考えることができれば、それはより速く以上のメモリ効率的であるかどうかを知りたいと思った: 次の関数は、整数へのすべての値を強制します。

の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) 

EDIT:最初のテスト

私はリチャードスクリヴンの答えは説明し何が機能し、私が定義されたものを定義し、速度をテストしました。

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 

明確な優勝者があります。

答えて

6

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 

私はどのくらい速いのか分かりませんが、かなり簡単です。

+0

私のために働いていない! – latorrefabian

+0

>マット< - マトリックス(1:1000000、のNcoI = 1000) > DIM(MAT) [1] 1000~1000 > object.size(マット) 4000200バイト>モード(MAT)< - '整数' > object.size(mat) 4000200バイト >クラス(mat [1、]) [1] "整数" – latorrefabian

+0

Rバージョン3.2.3(2015-12-10) プラットフォーム:x86_64-apple-darwin13.4.0 (64ビット) 実行中:OS X 10.11.3(El Capitan) – latorrefabian

関連する問題