ごゆるり日和

元気でヤンチャな子を推してるDSの備忘録など

これ(ベクトル)をこう(マトリックスに)したい

はじめに

これをこうしたい.
こういう変換をなんというかわからない. 時系列データで自己回帰モデルなどのベクトルからマトリックスデータを作成したい. 具体的には下図のようなベクトルから下図のようなマトリックスを作成したい.

ベクトル
これ
マトリックス
こう

愚直な方法

R言語の設定を行う.

y  <- 1:20
nrows <- 8
ncols <- 13

for文を使って愚直にデータを穴埋めする方法はすぐに思いつく.

data <- matrix(0, nrow = nrows, ncol =ncols)
for(i in 1:nrows){
  data[i,] <- y[(1:ncols)+(i-1)]
}

これで一応は目的のマトリックスは得られるが, かっこよくない
for文を使っているのが原因だろうか...

apply系を使用

Rの代表的(?)な関数にapplyがある. 詳しくは Rプログラム (TAKENAKA's Web Page) を参照されたい. やりたい処理が図で示されているので, apply系の中でどれを使えばいいか一目でわかる.

今回はsapplyを用いて目的のマトリックスを作成する.

data <- sapply(1:ncols, function(l) matrix( y[1:nrows+(l-1) ] ))

これで目的のマトリックスを作成できる. for文が無いだけでかっこよくかけてますね(?).

比較してみる

実行時間に違いがあるのか簡単にテストしてみます. テスト方法としては2000回実行したときの実行時間を比較します.

start_time <- Sys.time()
for(k in 1:2000){
 # 処理
}
end_time <- Sys.time()
end_time-start_time

結果

手法 計測時間
apply 0.285207 secs
for文 0.04589605 secs

おかしいな...

for文の方が速いぞ?

for文が遅いってのは昔の話なのか...

まとめ

簡単な処理すぎてfor文の方が早くなったのかな? for文の方が可読性も高いのは気のせいだろうか?

ツッコミどころ満載なことを書いてしまったので,誰か修正をよろしくお願いします(他力本願).

特に,目的のマトリックスの名前ベクトルからマトリックスへの変換の名前を教えていただけると 嬉しくて夜も眠れます.