[rogy Advent Calendar 2017]「うわっ…わたしのMATLABコード、遅すぎ…?」

[rogy Advent Calendar 2017]「うわっ…わたしのMATLABコード、遅すぎ…?」

rogy Advent Calendar 2017 17日目の記事です. 前の記事はもりゅーのV-REPとC/C++で自作ロボットを動かすでした.

「MATLABは遅い」,ほぅ…

MATLABに対する愚痴として有名なのが,「MATLABは計算が遅い」というものです. 曰く,「MATLABはインタプリタ言語だから」とか,「大規模計算向けに作られていない」とか. 実際の話をすると,MATLABはインタプリタ言語ですが最近のバージョン(R2015b〜)ではJITコンパイラを使った最適化が常時走っていますし,並列計算GPU計算によって大規模な計算も難なくこなせるように作られています.

では,コードが遅いのはなぜなのでしょうか?MATLABの問題なのでしょうか?コードを改善するだけで実行速度を速くできないのでしょうか? 今回はそんな問いに答えていきたいと思います.

この記事の内容の多くはOctaveにも使える話かと思いますので,フリーソフトウェア狂のOctaveユーザの方も参考にしてみてください.

また,大抵のテクニックは公式のドキュメンテーション[1]にも書いてありますが,この記事ではさらに掘り下げてマニアックな方法についても説明していきます.

なぜ遅いのか

なぜ手元のコードが遅いのか. それには大きく分けて以下の3つが考えられます.

  1. 反復回数の多いforループを多用している
  2. 配列の大きさを頻繁に変更している
  3. アルゴリズムが悪い

1. 反復回数の多いforループを多用している

MATLABにはループ処理が遅いという欠点があります. したがって,反復回数の多いforループをなるべく削減することが高速化への第一歩になります[2]

2. 配列の大きさを頻繁に変更している

MATLABの配列(行列やベクトル)は,動的にメモリを確保できるように作られています. したがって,たとえば

x = [0 1 2 3];  % x = [0 1 2 3]
x = [x x];  % x = [0 1 2 3 0 1 2 3]

というように,配列の大きさも動的に変更することができます.

しかし,これには変数にメモリを新たに割り当て直す処理が必要となるので,通常の演算に比べて時間がかかります. 2, 3回なら問題ありませんが,これを1000回,1万回と繰り返してしまうと,全体としてパフォーマンスが低下してしまいます.

これを解消するために,zerosones 等のコマンドを使用して,予め必要なサイズのメモリを確保しておくことが推奨されています[3]

3. アルゴリズムが悪い

計算の遅いアルゴリズムを使用してしまうと,実行時間は長くなります(#それはそう). これはMATLAB側ではどうしようもありませんが,MATLABに予め実装されている高速なアルゴリズムを使って,自作の遅いアルゴリズムを置き換えることができる場合があります.


それではどのようにすればこれらの問題を解決できるのか,具体的な例を使って見ていきましょう. また,これらの問題を解決した上でさらに高速化するにはどのようなテクニックが有効かについても解説します.

Read More

Share Comments

2017年マイクロマウスシーズンを振り返って

2017年マイクロマウスシーズンを振り返って

ふりかえり

2017年の新作 “Vert” についてはこちら: Vertマシン紹介

今年は2年ぶりの新作を引っさげて大会巡りをする予定だったのですが,設計が予定通り進まず(平常運転),全日本大会のみでのお披露目となりました.

研究と並行しながらの設計・製作・調整作業に関しては,今年度は良い手応えを得ることができたので,来年以降も少なくとも出場はしていきたいと考えています. つぎは早めに設計をはじめること(大事),作業の見通しを立ててスケジュール管理をもう少しがんばること,なるべくお金と時間をかけない開発方針を立てること,などが課題でしょうか.

Read More

Share Comments

Vertマシン紹介

Vertマシン紹介

2017年製作の初ハーフサイズマウスです. メイン基板を垂直に立てていることが,ほかのマウスにない大きな特徴です.

Read More

Share Comments

SICE系学会・論文誌向け非公式BibTeXテンプレートファイルを作った

SICE系学会・論文誌向け非公式BibTeXテンプレートファイルを作った

概要

計測自動制御学会(SICE)系の学会や論文誌では,BibTeXテンプレート(bstファイル)が提供されていないため,参考文献を手動・もしくはRefWorksのような専用のツールでフォーマットする必要がありました. 1回の投稿の中で1度だけすれば良い作業なので大して苦にはならないのですが,自動化できるに越したことはありません. ということで,LaTeXユーザのみなさまにはおなじみのBibTeX向けのテンプレートファイルを作成しました.

tokoro10g/sicetran-bst

使い方

bstファイルをtexファイルとbibのあるディレクトリに入れて,texファイルの中で

\bibliographystyle{sicetran}

としてスタイルファイルを指定するだけです. リポジトリにサンプルを入れてあるので,参照してみてください.

どうなるか

SICEのスタイルにだいたい準拠した結果が得られます. 独特なものとして,

  • ページ番号: 始ページ/終ページ
  • 巻号: -号

等の書式に自動的に変換します.こんな感じに:

@inproceedings{rrbf2015icra,
    author={S. Rajappa and M. Ryll and H.H. B\"ulthoff and A. Franchi},
    title={Modeling, Control and Design Optimization for a Fully-actuated Hexarotor Aerial Vehicle with Tilted Propellers},
    booktitle={Proc. of the 2015 IEEE International Conference on Robotics and Automation},
    year={2015},
    pages={4006--4013}
}

注意事項

  • このスタイルファイルは非公式です.
  • @article, @inproceedings 等のよく使用するクラスには対応していますが,私があまり使わない @booklet 等については出力結果がおかしくなる可能性があります.
  • おかしな出力結果が得られた場合は,日本語でIssue報告してください.直したくなったときに直します.
  • 論文誌について,最終版投稿時には,生成されたbblファイルの中身をtexファイルに貼り付けるようにしてください.bstとbibを入れたまま提出すると,出版社から怒られる可能性があります.
Share Comments

OnshapeでDMM.make 3Dプリント向けに複数パーツを1つにまとめる

OnshapeでDMM.make 3Dプリント向けに複数パーツを1つにまとめる

概要

つい数年前までは手軽な3Dプリントの選択肢はShapewaysなどの海外サービスが主流でしたが,DMMが国内向けの3Dプリントサービスをはじめたことにより,3Dプリント部品の発注がより手軽になっています.

DMM.make 3Dプリントサービスでは,様々な種類のマテリアルで安価に造形が可能ですが,複数のパーツを個別に注文すると価格が跳ね上がるという問題があります. そこで,この記事ではWebブラウザ上で動作するCADソフト Onshape を対象に,複数パーツを1つにまとめる方法を紹介します.

Onshapeの紹介についてはこちらをご参照ください. Webブラウザ上で動くクラウド3DCAD Onshapeの紹介 : 東京工業大学 ロボット技術研究会

追記

伝聞や読んだ記事の影響で,まとめないと造形してくれないと勘違いしていたのですが,1つのファイルにまとまっていればわざわざつなげなくても作ってくれるようです.

選べる素材一覧 - DMM.make 3Dプリント

こちらのページの各素材の項目にある「シェル数」という数字が,1ファイルに格納できる最大のパーツ数です. この記事のテクニックはほかでも使えるはずなので,一応残しておきます… もしかするとこのテクニックでくっつければ1パーツとみなされてお得になるかも??

Read More

Share Comments