ナンクル力学系

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

Rで複数の3D曲線を描く関数を作ってみたけど異様に遅い

leave a comment »

球の三次元プロット (r-help 記事より, 2003.12.27) << グラフィックス参考実例集:自作グラフィックス投稿欄 – RjpWiki を参考にして、作ってみた。

関数と実行例:

# # デフォルトで定義されているっぽい?
# trans3d <- function(x,y,z, pmat) { # tr <- cbind(x,y,z,1) %*% pmat # list(x = tr[,1]/tr[,4], y= tr[,2]/tr[,4]) # } 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 <- list(c( min(linelist[[1]][[1]]), max(linelist[[1]][[1]]) ) , c( min(linelist[[1]][[2]]), max(linelist[[1]][[2]]) ) , c( min(linelist[[1]][[3]]), max(linelist[[1]][[3]]) ) ) for (lin in linelist) { for (i in seq(length(limit))) { limit[[i]] <- c(min(min(lin[[i]]), limit[[i]][1]) , max(max(lin[[i]]), limit[[i]][2]) ) } } # # 上書き(この辺に,xlim=NULLあたりの処理をかくつもり) # 上限と下限の差が0より大きいかチェック for (i in seq(length(limit))) { 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(list(x0,y0,z0), list(x1,y1,z1))) [/sourcecode]

なんで遅い?

  • たぶん、
    • forを使いまくっている
      • Rっぽくないよな
    • listを使いまくっているデータ構造が、そもそもRっぽい処理に向かない?
    • linelistの一つ目の要素を二回しらべている
      • [あとでなおす] 手を抜きました><
Advertisements

Written by tkf

March 10, 2009 at 11:52 pm

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: