質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
R

R言語は、「S言語」をオープンソースとして実装なおした、統計解析向けのプログラミング言語です。 計算がとても速くグラフィックも充実しているため、数値計算に向いています。 文法的には、統計解析部分はS言語を参考にしており、データ処理部分はSchemeの影響を受けています。 世界中の専門家が開発に関わり、日々新しい手法やアルゴリズムが追加されています。

Q&A

解決済

1回答

1408閲覧

Rの重複while文を高速化したい。

Shellykagoshima

総合スコア17

R

R言語は、「S言語」をオープンソースとして実装なおした、統計解析向けのプログラミング言語です。 計算がとても速くグラフィックも充実しているため、数値計算に向いています。 文法的には、統計解析部分はS言語を参考にしており、データ処理部分はSchemeの影響を受けています。 世界中の専門家が開発に関わり、日々新しい手法やアルゴリズムが追加されています。

0グッド

0クリップ

投稿2018/11/12 09:57

以下の重複while文(for文でも同じです)を高速化するにはどうしたらよろしいでしょうか?特に、重複while文中で解析した全結果を保存するために、fout <- file(filename, "w") で書き込むことをしており、apply系を適用する際にどのようにそこを書けばよいのか分からずに困っています。 宜しくお願いします。

time <- Sys.time() # 現在の日付
print(time)

r <- 0.0  
step <- 1L*0.1 #rの自動増幅ステップ
Width <- 10
Height <- 10

MAXr <- (Width^2+Height^2)^0.5

while (r <= MAXr) { #rの変更(stepによる)

i <- 1
MAXi <- (Width*Height)/step

filename <- sprintf("~/R/Dr%03d.csv",as.integer(r)) #ファイル名をr名を使って連番にする。
fout <- file(filename, "w") # ファイルを書き込みモードで開く。
while (i <=MAXi){
Y <- ceiling(i/(Width)) #y座標
X <- round(i-(Y-1)*Width,1) #x座標

j <- 1
while(j <= MAXi){
y <- ceiling(j/(Width)) #y座標
x <- round(j-(y-1)*Width,1) #x座標

distance <- round(((x-X)^2+(y-Y)^2)^0.5,1)  #小数点1桁まで if(round(distance,1) == round(r,1)) {Dr=1} else {Dr=0}

if((x==Width)&&(y==Height)) break
j <-j+1

writeLines(paste(Dr,X,Y,x,y,sep=","), fout)
}

if((X==Width)&&(Y==Height)) break
i <- i+1

} #close i

close(fout) #書き込みファイルを閉じる
Dr <- read.csv(filename, header=T, sep=",")

r <- r+step
} #r close

time2 <- Sys.time() # 現在の日付
print(time2)

proc.time <- time2-time
print(proc.time)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

どれぐらいの高速化が可能かはわかりませんが、少なくとも言えることは「ループの外に出せる処理は全部外に出せ」です。

たとえば、MAXi <- (Width*Height)/step というのがありますね。WidthもHeightもstepも定数なので、1回計算すれば十分です。しかしwhileの下に入っているのでループの回数-1回分無駄に計算を繰り返しています。このようなパターンがあちこちにあるので、まず見直しましょう。

投稿2018/11/12 18:56

KojiDoi

総合スコア13669

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Shellykagoshima

2018/11/12 23:13

貴重なご意見ありがとうございます。ご提示内容に基づきコードを変更したところ、計算時間が短くなることを確認しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問