C vs MATLAB
いま作っているプログラム、最終的にはMATLAB上/SimulinkのS-Functionとして、このチームで開発中のシミュレータに組み込みます。S-Functionの中身を記述する言語は、MATLABかCが候補です。(C++やFortranでも書けるけど、とりあえず除外)
一長一短で、
【S-Functionの作りやすさ】
MATLABのほうがS-Functionにするとき面倒が少ない。
CではMEXという形式にするらしい。説明を読んだけど難しそう。
【実行速度】
コンパイラ言語のCの方が一般的に速い。
インタプリタ言語のMATLABは速度で劣る。
【自分のスキル】
Cは経験有り。
MATLABは事実上初めて。でもこの機会に覚えたい。(周りには内緒)
ここで、難しさや経験不足は、自分で克服できるので、考慮の重みづけは低いです。気になるのは速度です。前回のグループミーティングでも、プログラミングに強い者が「処理データが多そうだから、速いC-MEXがいいだろうなあ」という意見でした。
そんなこともあって、Cでプログラムを始めました。まだ、S-Function化は保留で、動作の見通しをつけるため、Cのスタンドアロン・プログラムです。
処理は3段階。
(1)引数で受け取った軌道要素から、MASTERを起動し、デブリ衝突のデータファイルを出力させる。
(2)データファイルを読み、後で使うのに適した表に変換する。
(3)軌道上の任意の点でのデブリの影響を、用意した表から計算する。
この(1)(2)は時間が掛かる処理で、シミュレーションの開始準備時に1回だけ実行。(3)はシミュレーション中に随時実行。
いま(1)(2)まで出来ています。
さて、自分のノートPC(Windows/Pentium M/1.2GHz)で実行したら、(1)に10分、(2)に20分かかりました。(1)はMASTERの処理時間なので、これ以上縮みません。(2)は1GB以上のデータファイルを読みながら計算するのに時間がかかっています。
本当にMATLABは遅いのか?ちょっと、思うところあって、MATLABでほぼ同じことをさせて、時間を比較してみました。これは、Linux/Sempron/1.8GHzです。
MATLABに不慣れなせいもあって、まずはCと同じアルゴリズムで、直訳してテストしてみたら・・・43分。こんなに遅いのは、Cのfgetsに相当するfgetl関数で、ファイルから1行ずつ600万行以上も読み込んで、そのつど計算しているので、インタプリタ言語に不利なループ処理が多いからです。次に、まとまったブロックを行列に読み込める、MATLAB独自のtextscan関数を試してみました。1GBの巨大ファイルが一度に読めるか心配でしたが、無事に処理できました。計算も1行分ずつちまちま加算じゃなくて、MATLABのベクトル演算機能で、えいやっと一気に計算できて、わずか5分に短縮できました。ループによるオーバーヘッド時間をなくせば、MATLABだって個々の組み込み関数はネイティブなんだから、速くできます。
(3)の処理で必要になる、表からの補間関数計算も、チーム既存のC-MEXのサンプルプログラムをもらい、読んでみたけど汚いコード。MATLABのinterp1関数で一発なのじゃないか?これももしかしたら、MATLABのほうが速くなるかも。
加えて、いままで作りかけのプログラムは、WindowsのVisual C++ 2005 Expressで開発していましたが、Linuxへ持っていったら、プラットフォーム依存で直すところが出てきて、だったらいっそMATLABで作り直しても、そんなに労力は変わらないかな、と。
MATLABへ心が傾いています。
| 固定リンク
「パソコン・インターネット」カテゴリの記事
- 四則演算で10を作る(2016.07.20)
- ResearchGate(2015.12.30)
- PowerPoint操作のTIPS (PowerPoint 2013に改訂)(2014.05.22)
- プログラミン×宇宙兄弟 コンテスト(2013.10.23)
- Facebook(2011.10.05)
コメント
1GBの巨大ファイルがちゃんと最後まで読み込まれて処理されているか、内容の末尾が見たくてテキストエディタで開こうとすると、延々とディスクアクセスしたまま帰ってこない。(WindowsもLinuxも)
Linuxのほうでtailコマンドをしてみたけれど、なぜか最後ではなく17万行目あたりが表示される。wcコマンドで見ると、517万行あるはず。MATLABにできた行列も517万行だったから、OKでしょう。
ひとつだけ巨大で1GB、他は数十MBのが9個、計650万行ありました。
投稿: ごんざぶろう | 2009年4月23日 (木曜日) 19:39