Rコードの最適化例:配列はベクトルとして操作する
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
]
開始行:
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))
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
終了行:
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))
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
ページ名: