アットウィキロゴ

rmemo

R memo

C言語とC#とR
単数の変数を扱うのであれば、ほとんど同じと思われる。違いはC言語とC#は型にうるさいのに対して、Rは型のことは気にしなくても欲しい結果が得られることだろう。
ベクトル、行列、テーブルを扱うときに、話が変わってくる。C言語でやろうとすると、forループが必須である。C#では、forでもできるが、個数を意識しなくてよいforeachや、私は使いこなせないがLINQを使うことによって、あたかもブロック単位に演算しているようなコードが書ける。Rではもっと気楽に、単数とベクトルと行列を同じ書式で記述できてしまう。

たとえばn個の実数(double)からなるベクトルaの成分をすべて2倍したものをbに代入するには、

C言語
// 配列bはすでに確保されているものとして、、、
for (i=0; i<n; i++){
 b[i] = a[i] *2;
}

C#
その1
var b = new double[a.Length]; 
for (inti i=0; i<a.Length; i++){
 b[i] = a[i] * 2;
}
//これは単に 配列長 n が必要なくなったというだけ。

その2
var b = from i in a select i * 2;
//LINQを使った書き方。速度は遅くなるが、今後PLINQが使えるようになれば別かも。

その3
//ベクトルクラスにして演算子*をオーバーロードすれば、
var b=a*2;

R
b = a*2    # b <- a*2のほうが推奨される書き方らしいが・・・

ベクトル以上のデータを扱うときは、Rのほうが短いコードで済んでしまうであろう。プログラミングにかかる時間もRのほうが短いであろう(慣れれば)。しかし問題は実行時間である。Rはインタープリター言語なので、実行速度が遅い。プログラミングにかかる時間と実行時間をよく天秤にかける必要がある。1度実行すれば目的が達せられるプログラムであれば、仮にRではコーディングに1時間、実行に24時間、C#ではコーディングに3時間、実行に10分だとしても、Rでコードする人が多いかもしれない。しかし、これを100回実行する必要がある場合(たとえば患者100人分の画像データを処理するとか)、Rでは計算だけで100日かかるが、C#では数日で終わる。

Rはインストールしたばかりの初期状態でも極めて高機能であるが、驚くべきは付加できるパッケージの膨大さである。生物学関係だけでも圧倒されるほどたくさんある(ref)。自分の目的に合ったものを選び出し、正しい方法で使用するのは、相当な苦労がいるに違いない。

画像のフィルターは、convolve関数のtype="filter"がポイント。
a=rnorm(100)  #100個の正規乱数
b=c(1/5,1/5,1/5,1/5,1/5)
c=convolve(a,b,type="filter")
plot(a,ylim=c(-3,3))
par(new=T)
plot(c,ylim=c(-3,3),pch=2)
なお、aの長さは100だが、cの長さは96になっている。

convolve関数の中身は、convolve [enter] で表示されるのでわかりやすいが、
要点は、
1. 被フィルター配列の「前」に、フィルター配列数-1個のゼロを加える
2. フィルター配列の「後」に、ゼロを加えて、上記の「ゼロ+被フィルター配列」と同じ長さにする。
3. 被フィルター配列をfft、フィルター配列をConj(fft(XX)) して、両者をかけあわせる(普通に要素ごとのかけ算)。
4. その配列をfft(YY,inverse=T)する。
5. できた配列の前と後をトリムして、完成

plot関数の中で、ann=F,axes=F と書いたのに軸のラベルや数値が表示された!
なぜだ?
調査の結果、Fという名前の変数に何かを代入してあったことが原因と判明した。
横着しないで、ann=FALSE, axes=FALSEと書くことで余計なバグフィックスの時間を節約できたはずだ。
次回から気をつけよう。

DOS窓のコマンドラインから、
R CMD BATCH test.r result.txt
とすると、test.rを実行して、result.txtに出力してくれる。
最終更新:2010年08月27日 11:54
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。