Rコードの最適化例:配列はベクトルとして操作する
の編集
http://www.okadajp.org/RWiki/?R%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E6%9C%80%E9%81%A9%E5%8C%96%E4%BE%8B%EF%BC%9A%E9%85%8D%E5%88%97%E3%81%AF%E3%83%99%E3%82%AF%E3%83%88%E3%83%AB%E3%81%A8%E3%81%97%E3%81%A6%E6%93%8D%E4%BD%9C%E3%81%99%E3%82%8B
[
トップ
] [
編集
|
差分
|
バックアップ
|
添付
|
リロード
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
]
-- 雛形とするページ --
(no template pages)
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
テキスト整形のルールを表示する