ナンクル力学系

学んだ事を書き連ねていこう。

Rで複数の3D曲線を描く関数を少し直した

leave a comment »

Rで複数の3D曲線を描く関数を作ってみたけど異様に遅い « ナンクル力学系 で作った関数を少し変更。

関数と実行例:

lines3d <- function(linelist, theta=25, phi=30, expand=1, xlab="X", ylab="Y", zlab="Z", ticktype="detailed", xlim=NULL, ylim=NULL, zlim=NULL ){ # x,y,z の上限と下限を求める limit <- matrix(c(range(linelist[[1]][,1]) , range(linelist[[1]][,2]) , range(linelist[[1]][,3]) ), c(3,2), byrow=T) for (lin in linelist) { for (i in seq(3)) { limit[i,] <- range( lin[,i], limit[i,] ) } } # limitが指定されていれば上書き if ( !is.null(xlim) ){ limit[1,] <- xlim } if ( !is.null(ylim) ){ limit[2,] <- ylim } if ( !is.null(zlim) ){ limit[3,] <- zlim } # 上限と下限の差が非零かチェック for (i in seq(3)) { if ( limit[i,1] == limit[i,2] ){ limit[i,1] <- limit[i,1] - 1 limit[i,2] <- limit[i,2] + 1 } } pmat <- persp(0:1, 0:1, matrix(,2,2), xlim=limit[1,], ylim=limit[2,], zlim=limit[3,], theta=theta, phi=phi, expand=expand, xlab=xlab, ylab=ylab, zlab=zlab, ticktype=ticktype ) for (lin in linelist) { lines(trans3d(lin[,1], lin[,2], lin[,3], pmat)) } return(pmat) } x0 <- seq(-1,1,length=1000) y0 <- cos(x0*6*pi) z0 <- rep(0,length(x0)) x1 <- seq(-1,1,length=200) y1 <- rep(0,length(x1)) z1 <- sin(x1*2*pi) lines3d(list(cbind(x0,y0,z0), cbind(x1,y1,z1), cbind(x1,y1+1,z1*0.2), cbind(x1,y1-1,z1*0.5))) [/sourcecode]

「異様に遅い」は嘘でした><

id:syou6162さんに system.time を教えてもらって 関数を実行する部分だけ時間はかってみたら、全然遅くなかった。

疑問

  • 「system.time(lines3d <- function(略))」 とやってみた
    • 実時間でかなり時間かかる
    • でも、 system.time が表示する実行時間は0秒
    • なぜ? Rは関数の評価に時間かるんだろうか?
  • 「source(‘ファイルへのパス’)」で実行してみると瞬殺
    • RじゃなくてESSの問題とか?

他やること

  • まじめにやるなら、
    • lineごとに色や線種を変える
    • 凡例を出す
    • 外で定義したpmatを使えるようにする
    • 。。。とかやるべきだけど、[あとでやる]
      そんなに複雑なグラフは今は書かないはず。

Written by tkf

March 11, 2009 at 2:15 am

Posted in PC

Tagged with

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: