2020年
3月
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31

setup diary

2007|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|06|08|11|
2015|01|02|03|04|05|06|07|08|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|09|10|11|

2020-03-02 Rで三次元のベクトルの計算

_ Rで外積

Rにベクトルの計算をさせていたら、通常の外積が無いことに気がついた。とりあえず、適当に定義してみた。

"%v%"<-function(x,y)c(x[2]*y[3]-x[3]*y[2],x[3]*y[1]-x[1]*y[3],x[1]*y[2]-x[2]*y[1])

これでa%v%bとすれば、ベクトル外積が計算できる。名前は平行六面体の体積を計算するときに使うので、vにしてみた。oもxもすでに使われているし。

"%v%"<-function(x,y)x[c(2,3,1)]*y[c(3,1,2)]-y[c(2,3,1)]*x[c(3,1,2)]

の方がRチックで良いかな。


2020-03-21 Rの高速化

_ BLAS/LAPACKとparallel

行列を使って対角化などの計算をやっていたのだが、高速化ができないかを試してみた。

Rの通常の計算はそれほど速くないが、Rの行列計算は、BLAS/LAPACKを使っているので、それなりに速い。sessionInfo()とすると、どのBLAS/LAPACKを使っているかが表示される。標準のもの以外にも、openblasやatlasやintel-mklなどがあり、これらを使うことにより、多少速度が変わるらしい。debianの場合は、libopenblas-base, libatlas3-base, intel-mklをaptで入れて、

sudo update-alternatives --config libblas.so.3-x86_64-linux-gnu
sudo update-alternatives --config liblapack.so.3-x86_64-linux-gnu

とすると、これらを変更できる。私の環境では、atlasが若干速かったので、これを使うようにした。

繰り返し計算などで有効なのが、並列計算である。近年のCPUの多くが、複数のコアを持つので、これらを使って同時に計算をすることができれば、原理的にはコアの数の分だけ速くなるはずである。Rでは、parallelというlibraryを使うと、比較的簡単に並列計算ができるらしい。

library(parallel)
cores <- detectCores()
cl<-makeCluster(cores,type="PSOCK")

として、コアの数だけ同時に計算できるようにして、clusterApply()やparSapply()を使って、リストやベクトルの計算をすれば良いのだが、それぞれのコアライブラリを組み込むためにclusterEvalQ()で実行したり、変数を認識させるためにclusterExport()を使ったりする必要がある。計算の準備などをするために、実際にはコアの数分の一にはならないが、それなりには速くなる。また、最後にはstopCluster(cl)としておく。

単純な計算の並列化には成功したが、関数の中でmulti-coreを使って計算しようとしたら、環境の部分などでトラブって、なかなかうまく行かない。Rを使うと比較的簡単に並列計算ができることが分かったが、いろいろと癖がありそうである。


2020-03-31 sambaを使ったファイルのやりとり

_ win7とwinXPの違い

測定用のPCにおいては、WinXPやWin7などのサポートの切れたOSを使っているものが多くある。これらのPCからデータを取り出すときに、どのようにするかが問題である。直接USBメモリなどを挿すと、そこからウイルスが感染する可能性があるし、ネットワークに繋ぐと同様である。そこで、以前構築したのが、閉じたネットワークにLinuxPCを参加させて、そのPCからUSBメモリで取り出す仕組みである。Linuxにウイルスが感染してそれがWindowsに伝染ったらどうしようも無いが、その可能性は非常に低くなる。

十年ぐらい前に作った時には、/etc/fstabには以下のように記述していた。

//ip_win7/DATA  /home/user/dir1/  smbfs iocharset=utf8,password=,defaults,ro,user 0 0
//ip_winxp/DATA  /home/user/dir2/  smbfs iocharset=utf8,password=,defaults,ro,user 0 0

これで、起動時にwindowsのディレクトリがLinuxにマウントされる。今回、PCも古くなったので、一新することになった。Debian10を入れて、sambaを使うためにcifs-utilsを入れる。smbfsとcifsで使い方はほとんど一緒だと思ったのだが、微妙なところが違って苦労した。結局、以下のように記述した。

//ip_win7/DATA /home/user/dir1 cifs iocharset=utf8,password=,user,dir_mode=0755,file_mode=0755 0 0
//ip_winxp/Data /home/user/dir2 cifs iocharset=utf8,password=,user,dir_mode=0755,file_mode=0755,vers=1.0 0 0

まず、重要なのが、ディレクトリの最後のスラッシュの有無である。次に問題なのが、マウントしたときのmodeの指定である。最後に悩んだのが、win7とwinXPの違いである。XPではSMB1.0なのだが、vers=1.0を指定しないとアクセスできない。7はSMB2.0にも対応しているので、指定しないでも大丈夫なようだ。