【移植】OOPs!!
この記事は旧ブログ(Tumblr)から移植したものです。
研究でシミュレーションしなくちゃならなくなって、さぁ大変。
卒論もそろそろ書き始める頃らしく、シミュレーションは不可避らしい…。
先輩にも先生にも「シミュレーション簡単だからできるはずだよ☆」とか、よく言われるんですが、これがなかなか難しい。
ベースとなるプログラムも先輩方から戴いてるんですが、上手くいかない。
何故なのか。考えてみました。
1.matlab
先輩から戴いたコードはmatlabで書かれているのですが、matlabは研究室ごとに同時起動数が制限されていたり、ライセンスを個人で持っていないので家ではできない(Academic版は販売されていますが、買ってない…)といった事情があります。
それはmatlab自体の性能とあんまり関係ないのでは、といわれたらそうかも。うーん、まぁ、なんかコード読んでてイライラするんですよね…。何でなんですかね。数字が1から始まるから?
2.可読性
先輩のコードを元にシミュレーション書いたりしてるんですが、まぁ、読めないですね。コメントのないコードは読めないです><
単位(オーダー)も人によって違ったりして…。シミュレーション間の攛り合わせが困難。
まぁ、支障はさほどないって言えばそうなんですが、変数名もわかりにくかったり。
うーん、と思った変数例
・nagasa
lengthの方がいいとおもう…。
・ramda
これは難しくて、λってlambdaっていうスペルなんですが、ラムダ式の予約語になってるケースがあって面倒。twitterに投げたらwavelengthでええやんって言われました。wavelenとかwlen、wlが妥当なんですかね。
そんなこんなで、何故かPythonでコード書き直してます。
Pythonのライブラリに科学計算用のNumpy, Scipy, Matplotlibというのがあり、matlabのコードを概ね再現できます。
当初はWindowsにDebian wheezyのVMつくってemacsで編集してターミナルからPythonを起動したりしていたのですが、素人なので使いづらく、PyDevを導入することでPythonファイルの実行が可能と知ったので、統合開発環境eclipseの日本語パッケージPleiadesに移行。その後、別にLinux上でやる必要ないよね、って感じでwindows上で作業するようにしました。
matlabのデータをPythonに移植し、シミュレーションプログラムが一回起動しただけで終了する仕様だったので、パラメータをいろいろ動かして実行できるように、変数に代入する値をリスト化、イテレータで組み合わせることに。
import itertools
for n in list(itertools.product(list1,list2,list3,list4)):
calc(n)
まぁ、こんな感じ。「組み合わせ」で検索すると別の情報がいっぱい出てきてこの箇所だけでかなり時間食った…。
イテレータで動かすのにあたって、従来のコードも残そうとしたために、mainの部分等はコピペでほぼ同じ文章が二重に載っている状態に。
そこで、classとか使えば省略できるんじゃない?と考える。講義ではCを勉強したのですが、構造体はやったもののクラスとかやらなかったので、今まで使っていなかったので…。
ウェブサイトいろいろ見ながらやってるんですが、上手くいかないですね。
selfとか何ぞ?っていう感じ。
パラメータを継承したり、イテレータで作ったリストでそのパラメータを一部上書きしたりしたいんですが、上手くいかない…。
卒論がじわじわと迫っているので、自分のプログラムのリファクタリングとかやってる場合じゃない気がします。仕方がない。matlabでやるかーと思っても、研究室行く必要があったり、先輩のPCが認証サーバなのでどっちみち起動できなかったり。あぁ、不便なり。
オブジェクト指向使えるようになりたいですね…。