Juliaやってみよう。三日目。MATLABコードを翻訳してみる。
まあ、多少慣れてきたのでMATLABのコードを翻訳してみる。
お題は、Izhikevichモデルの有名な1000個のニューロンのシミュレーションするモデル。短いし、まあ、こーゆーことをやるための言語だし。
MATLABのオリジナルはこちら。
% Created by Eugene M. Izhikevich, February 25, 2003 % Excitatory neurons Inhibitory neurons Ne=800; Ni=200; re=rand(Ne,1); ri=rand(Ni,1); a=[0.02*ones(Ne,1); 0.02+0.08*ri]; b=[0.2*ones(Ne,1); 0.25-0.05*ri]; c=[-65+15*re.^2; -65*ones(Ni,1)]; d=[8-6*re.^2; 2*ones(Ni,1)]; S=[0.5*rand(Ne+Ni,Ne), -rand(Ne+Ni,Ni)]; v=-65*ones(Ne+Ni,1); % Initial values of v u=b.*v; % Initial values of u firings=[]; % spike timings for t=1:1000 % simulation of 1000 ms I=[5*randn(Ne,1);2*randn(Ni,1)]; % thalamic input fired=find(v>=30); % indices of spikes firings=[firings; t+0*fired,fired]; v(fired)=c(fired); u(fired)=u(fired)+d(fired); I=I+sum(S(:,fired),2); v=v+0.5*(0.04*v.^2+5*v+140-u+I); % step 0.5 ms v=v+0.5*(0.04*v.^2+5*v+140-u+I); % for numerical u=u+a.*(b.*v-u); % stability end; plot(firings(:,1),firings(:,2),'.');
一晩格闘した結果、小生なりのJuliaへの翻訳がこちら。 オリジナルにはないVmを追加している。
using PyPlot Ne = 800; Ni = 200; re = rand(Ne, 1); ri = rand(Ni, 1); a = [0.02 * ones(Ne, 1); 0.02 * ones(Ni, 1)] b = [0.2 * ones(Ne, 1); 0.25-0.05*ri] c = [-65 + 15 * re .^ 2; -65*ones(Ni, 1)] d = [8-6*re .^ 2; 2*ones(Ni,1)] S = hcat(0.5 * rand(Ne+Ni,Ne), -rand(Ne+Ni,Ni)); v=-65*ones(Ne+Ni,1); # Initial values of v u=b.*v; # Initial values of u firings=[]; # spike timings Vm = []; # added for t=1:1000 # simulation of 1000 ms I=[5*randn(Ne,1);2*randn(Ni,1)]; # thalamic input fired=find(v.>= 30); # indices of spikes firings=[firings; hcat(t+0*fired, fired)]; v[fired]=c[fired]; u[fired]=u[fired]+d[fired]; I=I+sum(S[:,fired], 2); v=v+0.5*(0.04*v.^2+5*v+140-u+I); # step 0.5 ms v=v+0.5*(0.04*v.^2+5*v+140-u+I); # for numerical u=u+a.*(b.*v-u); # stability Vm = [Vm; v']; end; scatter(firings[:,1], firings[:,2], s=1);
いやー、なんかほとんどおんなじだ。JuliaはMATLABと同じでインデックスが1から始まるし、MATLABキラーだな。forループがendで終わってPythonよりMATLAB感がつよい。
PythonでNumpy使い始めたら、MATLABはv(2:5)とかベクターをスライスするときも括弧使うのが、ちょっと変な仕様だと気づいたけど、JuliaもNumpyのようにv[2:5]とスクエアブラケットでのインデックシングでしっくり来る。納得の変更・改善ばかり。後出しジャンケンは強い。
import numpyってしてないのに、素のJuliaでrandとか、onesとか使えるのがすごい。こういうアレイとかも実装はjuliaでJITまでついてくるんだからすごいな。pypyプロジェクトがnumpypyのRPythonでの実装に数年かかっているのをみると、juliaのアプローチの優秀さが分かる。numpypyは99%実装できたみたいだけど、まだ遅いので使い道ない・・。 numpyでいうvstackとかhstackはvcat, hcatらしい。
GRではscatterがよくわからなかったのでPyPlotでプロットした出力がこちら。
上のコードではVmはプロットしてないけど、するならこんな感じ。。
plot(Vm[:,32]) ylim([-90,100]);
ylimとかnumpyそのまま。
« Juliaやってみよう。二日目。Juliaのアップデート、IJulia | トップページ | Juliaやってみよう。四日目。@timeでプロファイリング »
「Python」カテゴリの記事
- Noteの記事をPythonでバックアップしといた。(2021.05.05)
- JupyterLabでも好きな外部エディターを使いたい!(2018.05.02)
- ローカルエリア内のJupyterLabサーバーにLAN経由で接続する。(2018.05.02)
- Juliaやってみよう。五日目。Pythonと速度比較。(2017.08.01)
- Juliaやってみよう。四日目。@timeでプロファイリング(2017.07.16)
「Julia」カテゴリの記事
- Juliaやってみよう。五日目。Pythonと速度比較。(2017.08.01)
- Juliaやってみよう。四日目。@timeでプロファイリング(2017.07.16)
- Juliaやってみよう。三日目。MATLABコードを翻訳してみる。(2017.07.15)
- Juliaやってみよう。二日目。Juliaのアップデート、IJulia(2017.07.13)
- Juliaやってみよう。一日目。GRでプロット。(2017.07.12)
« Juliaやってみよう。二日目。Juliaのアップデート、IJulia | トップページ | Juliaやってみよう。四日目。@timeでプロファイリング »
コメント