Rとjuliaとrubyとpython
Rとjuliaとrubyとpython
数値の取り扱い
juliaを少しいじり始めたのだが,複数の言語の文法を混同して分からなくなってしまうので,並べて比較してみることにした.まずは,数値や数学関係の取り扱い方を,4つの言語について表にしてみた.
R | julia | ruby | python3 | |
余 | 5%%2 | 5.0%2.0 | 5.0%2.0 | 5.0%2.0 |
商 | 5%/%2 | 5.0÷2.0 | 5/2 or 5.0.div(2.0) | 5.0//2.0 |
分数 | 5//2 | 5r/2 | from fractions import Fraction;Fraction(5,2) | |
xor | bitwXor(3, 5) | 3⊻5 | 3^5 | 3^5 |
累乗 | 2^0.5 | 2^0.5 | 2**0.5 | 2**0.5 |
平方根 | sqrt(2) | √2 | Math.sqrt(2) | import math;math.sqrt(2) |
複素数 | (1+2i)^0.5 | (1+2im)^0.5 | (1+2i)**0.5 | (1+2j)**0.5 |
複素数 | sqrt(1+2i) | √(1+2im) | Math.sqrt(1+2i) | import numpy;numpy.sqrt(1+2j) |
実部 | Re(1+2i) | real(1+2im) | (1+2i).real | (1+2j).real |
虚部 | Im(1+2i) | imag(1+2im) | (1+2i).imag | (1+2j).imag |
共役 | Conj(1+2i) | conj(1+2im) | (1+2i).conj | (1+2j).conjugate() |
偏角 | Arg(1+2i) | angle(1+2im) | (1+2i).arg | import cmath;cmath.phase(1+2j) |
絶対値 | abs(-1) | abs(-1) | -1.abs | abs(-1) |
円周率 | pi | π | Math::PI | import math;math.pi |
Euler数 | exp(1) | ℯ | Math::E | import math;math.e |
行列の計算の言語による違い
Rとjuliaとpythonとruby
プログラム言語で数値計算をしようとするときに,行列を扱う必要がある場合がある.そのやり方が言語毎に特徴があるので,比較してみた.例として,行列を定義して,固有値を固有ベクトルを求めて,対角化を計算する場合について,やり方を見てみよう.
まず,私が数値計算をするときによく使っているRでは,インストールするだけで,行列を使うことができる.逆行列を求めるコマンドがsolveである点と,行列の掛け算が%*%であることに注意すれば,簡単に使うことができる.
a<-t(matrix(1:4,2,2)) r<-eigen(a) r$values r$vectors solve(r$vectors)%*%a%*%r$vectors
次に,近年人気が出てきたjuliaであるが,これもインストールした時点で行列自体は使えて,さらにLinearAlgebraを組み込むことによって,固有値などの計算をすることができる.
a=[1 2; 3 4] using LinearAlgebra r=eigen(a) r.values r.vectors inv(r.vectors)*a*r.vectors
数値計算の分野でもシェアを広げているpythonでは,numpyを使う必要がある.pipなどでこれをインストールできる.私の場合は,debianでaptitudeからpython3-numpyを入れた.numpyをimportして,linalgを使うと計算ができる.行列の掛け算がnp.dot()で書かないといけないのが面倒だったのだが,新しいversionでは@を使えるようになったようだ.
import numpy as np a=np.array([[1,2],[3,4]]) r=np.linalg.eig(a) r[0] r[1] #np.dot(np.dot(np.linalg.inv(r[1]),a),r[1]) np.linalg.inv(r[1])@a@r[1]
最後にrubyであるが,数値計算は比較的苦手である.行列計算はnarrayを使えば良いのだが,固有値の計算などは困難である.そこで,numo-linalgというものを使ってみた.このインストールは少し手間取ったが,以下のようにしたらdebianにインストールすることができた.
sudo apt install liblapacke libopenblas0 sudo apt install git ruby gcc ruby-dev rake make sudo gem install specific_install sudo gem specific_install https://github.com/ruby-numo/numo-narray.git sudo gem install numo-linalg -- --with-backend=openblas --with-openblas-lib=/usr/lib/x86_64-linux-gnu
すると,numo/linalgをrequireしたら計算できるのだが,いちいちNumoと書くのが面倒なので,それをincludeした.narrayの場合には,NMatrixを定義すると,行列の積は*で書けるのだが,numoの場合には,numo-narrayのdotを使って書かないといけないのが面倒に感じた.
require "numo/linalg" include Numo a=NArray[[1,2],[3,4]] r=Linalg.eig(a) r[0] r[2] Linalg.inv(r[2]).dot(a).dot(r[2])
これらの4つの言語について,インストールのしやすさと,使いやすさを主観でまとめると,下の表のようになった.Rとjuliaはそれなりに使いやすいかな.pythonは行列の積が書きやすくなったことにより,昔よりは書きやすくなった.rubyはインストールが面倒だし,methodをうまく定義して,もっと使いやすくできるポテンシャルを秘めているが,まだまだのように感じる.ニーズが無いのかな.
install | use | |
---|---|---|
R | ◎ | ◎ |
julia | ◎ | ◎ |
python | ○ | △→○ |
ruby | △ | ○ |
数値計算をする場合には,Rを中心にやっていくことになりそうだ.juliaも使うようにすると,Rが苦手な処理を書きやすくなるかも知れない.
Linuxのメモリ
DMIをdecode
PCでどのようなメモリを使っているかを,Linuxから知るにはどうしたら良いかを調べてみたら,
sudo dmidecode --type memory
とすると,現在搭載しているメモリの情報が得られるらしい.sizeやtypeはもちろん,part numberや,rankも調べることが出来るのは便利である.ECCかどうかは,total widthが72bitかどうかで判断するのかな.error correction typeというところにも書いてあるけど.
dmidecodeでprocessorを指定したら,CPUの情報も見れる.core数やクロックなども表示してくれるので,便利である.
PGPかGPG
暗号化通信
暗号化通信としては,PGP(Pretty Good Privacy)が有名だったが,調べてみたら,GPG(Gnu PG)というのもあって,名前がややこしくなっていた.linuxには標準でGPGが入っているようなので,使い方を調べてみた.
まず,鍵のペアを作る.
gpg --gen-key
このとき,Real nameは五文字以上じゃないといけないが,emailは空欄でも良いし,復号のときに必要なpass phraseも不要なら適当で良いが空欄だと怒られた.-kオプションで実行すると,公開鍵の,-Kだと秘密鍵のリストが表示される.作った公開鍵をファイルに出力するには,
gpg -o pub.bin --export name
とする.別の公開鍵を読み込むには,
gpg --import keyfile
とする.公開鍵を削除するには,--delete-keyオプションを使う.暗号化するには,
gpg -e -r name file
とすると良い.このとき,file.gpgなどというファイルが出来るので,この状態で他の人に送ると良いだろう.復号化するには,
gpg file.gpgで良い.この時,pass phraseが要求される.
debianとpdf
pdfの編集
Linuxでpdfに文章を書き込む方法を探してみた.pdfを編集するには,libreofficeなどでもできる.しかし,もっと手軽にできないかと探してみたら,xournalというのを見つけた.
インストールはaptで簡単にできる.少し使ってみたところ,編集としては,直線や手書きや文字を追加することはできたが,図形などは無理なようだった.修正液で消すことも出来た.用途は限定されるだろうが,簡単なことを簡単にやるには良さそうだ.
cacheとswap
swapをあける
debianでメモリを大量に使う計算をやっていたら,メモリは足りているはずなのに,swapを使い始めた.swapを使っていると計算が遅くなるので,どうにかならないかなと思って調べてみたら,対応の仕方が分かった.このような場合には,メモリをcacheに使っていて,そのせいでswapが出来てしまうようだ.そこでまず,freeでメモリの使用状況を確認してから,cacheを開けるために,以下のコマンドを実行する.
sync echo 1 > /proc/sys/vm/drop_caches
freeで確認するとcacheが減っているはずである.そして,swapの内容をmemoryに移すために,以下のコマンドを実行する.
swapoff -a && swapon -a
すると,それまで使っていたswapが使われなくってすっきりした.
メモリ不足
swapを新たに設定
重い計算をしていたら,メモリが足りなくなったので,メモリを増設しないといけないかなと思っていたが,まずはswapでごまかすことにした.以前はHDDにlinuxをインストールするときに,swapを定義していたが,最近はSSDになり,メモリも増えたので,swapを定義しないようにしている.しかし,メモリ不足になったので,2nd storageであるHDDにswapを作ることにした.フォーマットをし直さないといけないのかと思っていたが,ファイルとしてswapを作ることができるようなので,やってみた.実行したコマンドを並べると,以下のような感じである.
cd /mnt/hdd su mkdir swap dd if=/dev/zero of=/mnt/hdd/swap/swap0 bs=1M count=100000 chmod 600 /mnt/hdd/swap/swap0 /usr/sbin/mkswap /mnt/hdd/swap/swap0 /usr/sbin/swapon /mnt/hdd/swap/swap0 exit
まずはhddにswapのファイルを作り,それをswapとして有効にする.起動時にこれが有効になるようにするには,/etc/fstabに以下を書けば良いようだが,これはまだ実行していない.
/mnt/hdd/swap/swap0 swap swap defaults 0 0swapを有効にしたことによって,メモリ不足で止まってしまっていたプログラムが無事に動くようになった.しかし,どの程度遅くなったかが問題だ.
共用のHDD
ext4で戸惑った
linuxで誰からも使える共通のHDDを設定しようとしたら,少し苦労した.まず,lsblkでHDDの名前を確認して,/etc/fstabに以下のように書いて,ユーザーからマウントできるようにした.
/dev/sda1 /mnt/hdd ext4 rw,noauto,user,exec 0 0
このままだと,ユーザーが書き込めないので,umaskを設定してmountしたら,以下のようなエラーが出た.
mount: /mnt: wrong fs type, bad option, bad superblock on /dev/sda1, missing codepage or helper program, or other error.
この原因をいろいろと調べていたが,フォーマットをしていないとか,ユーティリティーが入っていないという記述も見つけたが,結局分かったのが,ext4ではumaskの設定が無いからだった.mountしてからrootでフォルダを作って,そのpermissionをgo+rwxにしたら,ユーザーから普通に読み書きできるようになる.結果としては,この方が楽なのだが,やり方が変わるのは面倒でもある.