ページ

2011年4月29日金曜日

三頭山に行ってきた

今日から最大10連休の大型ゴールデンウィークがスタートしますが、今日は三頭山に行ってきました!!
下働きをさせていただいている研究者のお手伝い(!?冷やかしかな!?)のため

しかし、いい季節になりましたね〜
スミレが見頃を迎えています

また植物のお勉強が始まります

エイザンスミレ Viola eizanensis (Makino) Makino
2011年4月29日三頭山


ナガバノスミレサイシン Viola bissetii Maxim.
2011年4月29日三頭山

ハリモミ Picea torano (Siebold ex K.Koch) Koehne.
2011年4月29日三頭山

2011年4月12日火曜日

BAM

しばらく自粛していましたが,投稿を再開します。

今日はBAMについて

Rで一般化加法モデル(Generalized Additive Model)を使うにはmgcvを使うことが多いと思う。
mgcvでGAMを行うには,関数gam()を使うが,これとは別に関数bam()もある。


ヘルプページによると
Generalized additive models for very large datasets
とある。


詳しく説明を読むと
Description:

Fits a generalized additive model (GAM) to a very large data set,the term `GAM' being taken to include any quadratically penalized GLM. The degree of smoothness of model terms is estimated as part of fitting. In use the function is much like ‘gam’, except that the numerical methods are designed for datasets containing upwards of several tens of thousands of data. The advantage of ‘bam’ is much lower memory footprint than ‘gam’, but it can also be much faster, for large datasets.
gamとは推定方法が異なるが,どうも計算が速いらしい。


実際に使ってみると確かに速い。
(もう少し確認が必要だが...)結果はほとんど変わらないように見える。
自分のデータ(約7000件)では,これまで80秒ぐらいかかっていたが,約半分ぐらいまで短くなる。


もし大規模なデータを使っていて,さらにMuMInでモデル選択をしたい方はお試しあれ。
ただバージョンによってcontrolの指定方法が異なるので要注意。

1ヵ月

原発事故と余震でまだまだ余談を許さない状況ですが,震災からようやく1ヵ月が経ちました。
被災された方に心からお見舞い申し上げるとともに,一日も早い復興を心より祈っています。

2011年3月3日木曜日

GRASSのr.univarの出力をラスター演算(r.mapcalc)で使うには

今回もマニアックな内容です。

やりたいこと

GRASSのr.univarが出力する,あるラスターデータの最大値や最小値を使ってラスター演算(r.mapcalc)をする

方法
ターミナルユーザーであれば,awkを使うことで,問題なく処理をすることができる

あるラスターデータを "dummy" とする。
r.univarを実行すると,以下のように出力される。

$r.univar map=dummy
total null and non-null cells: 5157441
total null cells: 0
Of the non-null cells:
----------------------
n: 5157441
minimum: 0
maximum: 1
range: 1
mean: 0.0155387
mean of absolute values: 0.0155387
standard deviation: 0.123682
variance: 0.0152973
variation coefficient: 795.961 %
sum: 80140

出力結果を見てみると,最小値は7行目,最大値は8行目のそれぞれ2列目に出力される。

ということで,最大値のみを取り出すには次のようにする。
NRで取り出す行数を,\$で列数を指定している。
r.univar map=dummy | awk '{if(NR==8){printf(\$2); printf(RS)}}'

最小値の場合にはNRの部分を7にすればよい。
r.univar map=dummy | awk '{if(NR==7){printf(\$2); printf(RS)}}'

さて,値自体は取り出すことができたので,次はラスター演算(r.mapcalc)で使えるようにしたい。
単純に,取り出した値をシェル変数に代入する。
試しに,割合(%)を示すデータdummy2を作成してみる。
i=`r.univar map=dummy | awk '{if(NR==8){printf(\$2); printf(RS)}}'`
r.mapcalc "dummy2=(dummy/$i)*100"


これ以外にも方法はあると思う。単純にr.mapcalcの構文内に`r.univar map=dummy | awk '{if(NR==8){printf(\$2); printf(RS)}}'`を入れるだけでも良いかもしれない。

応用
次のようにすることで,r.univarの出力結果をテキストファイルに1行で書き出すことができる。
r.univar map=dummy | awk '{
if(NR==6){printf(\$2); printf(FS);}
else if(NR==7){printf(\$2); printf(FS);}
else if(NR==8){printf(\$2); printf(FS);}
else if(NR==9){printf(\$2); printf(FS);}
else if(NR==10){printf(\$2); printf(FS);}
else if(NR==11){printf(\$5); printf(FS);}
else if(NR==12){printf(\$3); printf(FS);}
else if(NR==13){printf(\$2); printf(FS);}
else if(NR==14){printf(\$3); printf(FS);}
else if(NR==15){printf(\$2); printf(FS);}}
END{printf(RS)}' > dummy2

これは非常に使える方法で,例えば沢山のラスターデータの統計量をひとつのテキストファイルにまとめることができる。
結果を書き込むファイルを "result.txt" とする
#結果を書き込むファイルを作成し,ヘッダを書き込む
echo "n minimum maximum range mean MeanOfAbsoluteValues
StandardDeviation  Variance VariationCcoefficient Sum" > result.txt
#マップセット内のラスターデータすべてのr.univarの出力をresult.txtに書きこむ
for i in `g.mlist rast`
do
r.univar map=\$i | awk \'{if(NR==6){printf(\$2); printf(FS);}
else if(NR==7){printf(\$2); printf(FS);}
else if(NR==8){printf(\$2); printf(FS);}
else if(NR==9){printf(\$2); printf(FS);}
else if(NR==10){printf(\$2); printf(FS);}
else if(NR==11){printf(\$5); printf(FS);}
else if(NR==12){printf(\$3); printf(FS);}
else if(NR==13){printf(\$2); printf(FS);}
else if(NR==14){printf(\$3); printf(FS);}
else if(NR==15){printf(\$2); printf(FS);}}
END{printf(RS)}' >> result.txt
done

GRASSでもこの辺りを充実してくれると嬉しいのですが...

2011年2月22日火曜日

GPSゲット!!


新しいGPS(GPSmap 62S)を購入しました。
右側ののやつが先代,左側のフェイスが最新型!!

英語版なので,4万2000円!!
お手頃価格ですね~!!

早速今週末の調査から導入しよう!!

2011年2月14日月曜日

誤ってフォーマットしたデジカメのメモリーカードを復旧!!

もう半年も昔に誤ってフォーマットしてしまったデジカメのメモリーカードをようやく復旧しました!!

これぐらい復元できることはわかっていたので,いつか復元しようと思っていたのですが,気がついたらもう半年もたってしまいました...

またいつか必要になるかもしれないので,念のため手順を書いておきます。
本当は必要にならないと良いのだけど...
このページを参考にされる方は,自己責任でお願いします。



まずは必要なソフトのインストール!!
今回はPhotoRecを使用した。
このソフトはubuntuのリポジトリにも登録されているので端末から以下のコマンドでOK!


sudo aptitude install testdisk

インストールしたら起動

photorec

すると以下の画面が表示される。
なになに,管理者権限で実行しなければならないとのこと
実行するには[sudo]に進む。











するとパスワードの入力が求められる。
パスワードを入力しEnter














復元したいメディアを選択する。
内蔵ハードディスクと,USBフラッシュメモリが表示されている。
ここは必ず慎重に確認してから進む












次にパーティションテーブルのタイプを選択する。今回は「Intel」を選択した。














次に復元したい領域を選択する。














ファイルシステムを選択する。FATなので「Other」を選択。














次に,解析対象を空き領域のみにするか,それともディスク全体にするか選択する。ここでは全体を選択。












次に復元したファイルを格納するディレクトリを選択する。













そしたら後は自動で解析が進む















ファイルサイズにもよるが,今回は結構早く終わりました














実際に指定した復元用のディレクトリを見ると,何かしら復元されているのがわかります。












ディレクトリを開いてみるとこのとおり。
ちゃんと復元されています。
ただ,ファイル名は変わってしまっていますが....












でもファイルのプロパティを確認してみると画像情報はちゃんと残っていました。



















すごいですね~
作業も楽で,とても便利です。

さて,今回は説明していませんが,作業は実際にはddこまんどでメモリーカードのデータをUSBフラッシュに移してから,USBフラッシュにたいして復元作業を行っています。
いろいろ検索してみるとわかりますが,そのほうが安全です。

2011年2月2日水曜日

RとFortranの演算速度の比較

そろそろFortranもお勉強しようかとおもい、プログラムをしてみることに!!

作業は、2地点間の距離と角度を求めるというシンプルなもの
ただ、データ数が多く、組み合わせが全部で22,232,390もある。

まずRでプログラミング
特に変なことはしていないと思いますが...

Tree<-read.csv("TreePlot",header=T)
IncW3<-read.table("IncW3Th10S3",header=T,sep=" ")
IncW5<-read.table("IncW5Th10S3",header=T,sep=" ")
IncW11<-read.table("IncW11Th10S3",header=T,sep=" ")

Tree<-as.matrix(Tree[,1:5])
IncW3<-as.matrix(IncW3)
IncW5<-as.matrix(IncW5)
IncW11<-as.matrix(IncW11)

DistW3<-matrix(rep(NA,nrow(Tree)*nrow(IncW3)*7),ncol=7)
DistW5<-matrix(rep(NA,nrow(Tree)*nrow(IncW5)*7),ncol=7)
DistW11<-matrix(rep(NA,nrow(Tree)*nrow(IncW11)*7),ncol=7)

for (i in 1:nrow(Tree)){
 for (j in 1:nrow(IncW3)){
 DistW3[i*j,1:4]<-c(Tree[i,4:5],IncW3[j,1:2])
 DistW3[i*j,5]<-sqrt((Tree[i,4]-IncW3[j,1])^2+(Tree[i,5]-IncW3[j,2])^2)
 DistW3[i*j,6]<-atan((Tree[i,5]-IncW3[j,2])/(Tree[i,4]-IncW3[j,1]))
 DistW3[i*j,7]<-atan((Tree[i,5]-IncW3[j,2])/(Tree[i,4]-IncW3[j,1]))*180/pi
 }
 for (j in 1:nrow(IncW5)){
 DistW5[i*j,1:4]<-c(Tree[i,4:5],IncW5[j,1:2])
 DistW5[i*j,5]<-sqrt((Tree[i,4]-IncW5[j,1])^2+(Tree[i,5]-IncW5[j,2])^2)
 DistW5[i*j,6]<-atan((Tree[i,5]-IncW5[j,2])/(Tree[i,4]-IncW5[j,1]))
 DistW5[i*j,7]<-atan((Tree[i,5]-IncW5[j,2])/(Tree[i,4]-IncW5[j,1]))*180/pi
 }
 for (j in 1:nrow(IncW11)){
 DistW11[i*j,1:4]<-c(Tree[i,4:5],IncW11[j,1:2])
 DistW11[i*j,5]<-sqrt((Tree[i,4]-IncW11[j,1])^2+(Tree[i,5]-IncW11[j,2])^2)
 DistW11[i*j,6]<-atan((Tree[i,5]-IncW11[j,2])/(Tree[i,4]-IncW11[j,1]))
 DistW11[i*j,7]<-atan((Tree[i,5]-IncW11[j,2])/(Tree[i,4]-IncW11[j,1]))*180/pi
 }
}

結果
ユーザ   システム       経過  
  1522.730      1.510   1528.272 

約25分ぐらいですか

次にFortranの場合
コードはこちら
program DistCalc
 implicit none
 real,dimension(1565,5)::Tree
 real,dimension(7146,3)::IncW3
 real,dimension(4952,3)::IncW5
 real,dimension(2108,3)::IncW11
 real pi
 real DistW3(1565*7146),AngW3(1565*7146)
 real DistW5(1565*4952),AngW5(1565*4952)
 real DistW11(1565*2108),AngW11(1565*2108)
 integer i,j 

 open(10, file='Tree')
 open(20, file='IncW3')
 open(30, file='IncW5')
 open(40, file='IncW11')
 read(10,*) ((Tree(i,j),j=1,5),i=1,1565) !iは行、jは列
 read(20,*) ((IncW3(i,j),j=1,3),i=1,7146)
 read(30,*) ((IncW5(i,j),j=1,3),i=1,4952)
 read(40,*) ((IncW11(i,j),j=1,3),i=1,2108)

 do i=1,1565
  do j=1,7146
  DistW3(i*j) = sqrt((Tree(i,4)-IncW3(j,1))**2 + (Tree(i,5)-IncW3(j,2))**2)
  AngW3(i*j) = atan2((Tree(i,5)-IncW3(j,2)),(Tree(i,4)-IncW3(j,1)))
  end do
 end do

 do i=1,1565
  do j=1,4952
  DistW5(i*j) = sqrt((Tree(i,4)-IncW5(j,1))**2 + (Tree(i,5)-IncW5(j,2))**2)
  AngW5(i*j) = atan2((Tree(i,5)-IncW5(j,2)),(Tree(i,4)-IncW5(j,1)))
  end do
 end do

 do i=1,1565
  do j=1,2108
  DistW11(i*j) = sqrt((Tree(i,4)-IncW11(j,1))**2 + (Tree(i,5)-IncW11(j,2))**2)
  AngW11(i*j) = atan2((Tree(i,5)-IncW11(j,2)),(Tree(i,4)-IncW11(j,1)))
  end do
 end do

 pi=4*atan(1.0)

 open(50,file="DistW3")
 do i=1,1565
  do j=1,7146
  write(50,*) Tree(i,4), Tree(i,5), IncW3(j,1), IncW3(j,2),&
   DistW3(i*j), AngW3(i*j), (AngW3(i*j)*180)/pi
  end do
 end do

 open(70,file="DistW5")
 do i=1,1565
  do j=1,4952
  write(70,*) Tree(i,4), Tree(i,5), IncW5(j,1), IncW5(j,2),&
   DistW5(i*j), AngW5(i*j), (AngW5(i*j)*180)/pi
  end do
 end do

 open(80,file="DistW11")
 do i=1,1565
  do j=1,2108
  write(80,*) Tree(i,4), Tree(i,5), IncW11(j,1), IncW11(j,2),&
   DistW11(i*j), AngW11(i*j), (AngW11(i*j)*180)/pi
  end do
 end do

end program DistCalc

で結果はというと、一目瞭然ですね!!
$ f95 DistCalc.f90
$ ./a.out

real 3m20.994s
user 3m14.140s
sys 0m5.330s

今回の場合には、Fortranのコードを書くだけで結構時間がかかった(まだ初心者なので)ので、Rだけで作業しても良かったかもしれません。
ですが、今後のことを考えてもFortranをお勉強したほうが良いですね〜
できればC++もお勉強したいのですが...