SIZE(18){COLOR(red){Rコードの最適化例:配列ベクトルとして操作する}}  ([[Rコード最適化のコツと実例集]] に戻る)~

R の行列・配列は次元属性を持ったベクトルに他ならず、ベクトルとしてもアクセスでき、多重添字の計算に要する手間の分だけ高速です。次元情報が非本質的な操作はベクトルとして操作する方が簡単になります。

 > test1 <- function(x) { # 行列としてアクセス
              for (i in 1:dim(x)[1]) 
                for(j in 1:dim(x)[2]) 
                  s <- s + x[i,j]
              s}
 > test2 <- function(x) { # ベクトルとしてアクセス
              for (i in 1:length(X)) 
              for (i in 1:length(x)) 
                s <- s + x[i]
              s}
 > X <- matrix(runif(100000), nc=1000)
 > system.time(test1(X))
 [1] 0.49 0.00 0.52 0.00 0.00
 > system.time(test2(X))
 [1] 0.38 0.00 0.40 0.00 0.00

ベクトルに他ならない以上、以下のようにベクトル化関数を直接適用できます。普通、次元属性は保たれます。

 XX <- sin(X)    # ベクトル化関数をそのまま適用
 > dim(XX)       # 結果はやはり行列
 [1]  100 1000

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS