web-dev-qa-db-ja.com

MATLABでプロジェクト構造を視覚化する方法は?

私は数千行のMatlabコードを所有するようになりました。その中には、900を超える行関数と、function_name.mファイルでいっぱいのいくつかのディレクトリがあります。すべてが何をしているのか(または関連しているのか)を理解したり、依存関係を理解し​​たりするのは困難です。どの関数がどの関数からどの順序で呼び出されるかなど、関数の構造を視覚化するために何を提案しますか?

53
Benjamin Oakes

NumPyへのポート。

(冗談で。)

通常、Matlabには、関数として記述されたファイルとスクリプトとして記述されたファイルがあります。スクリプトは、処理するデータをロードし、それを関数にフィードしてグラフ化するなどの処理を実行します。

物事を整理するために、トップレベルのスクリプトから始めて、ロード、グラフ化、処理などを行う関数を見つけます。スクリプトをトップレベルのディレクトリに保持し、目的に応じて関数をサブディレクトリに分割してみます。関数。関数の依存関係を同じサブディレクトリに配置します。ディレクトリ内のコードが親ディレクトリ(またはいとこディレクトリ)内の何かに依存しないようにするようにしてください。

関数が何をするのか、そしてその引数が何であるのかを理解するときはいつでも、ドキュメントコメントを書いてください。

これは、コードを書いた人が合理的であると想定しています。そうでない場合、Matlabを使用すると、すべてを1つのディレクトリに簡単にまとめて、コードの厄介なタワー内の他のすべてに依存させることができるため、多くのリファクタリングを行うことになります。

44
ptomato

あなたのコードにはまともなヘルプテキストが付いていますか?その場合、 m2html は、リンクされたhtmlヘルプを作成して簡単に閲覧できるため、非常に役立ちます。

さらに、依存関係グラフを作成できるため、コードをどのように編成するかをもう少し理解するのに役立ちます。

14
Jonas

私はTheMathWorksでのさまざまな役割で、この問題に何度も対処しなければなりませんでした。これは、MATLABコードの大きな部分に対して私が行うことです。

  1. おそらく2回バックアップしてください!
  2. すべて選択し、Ctrl-Iでスマートインデントします
  3. すべて選択し、Ctrl-Jでコメントを折り返します

  4. 紙ベースだと感じている場合-すべてのファイルを印刷し、蛍光ペンのセットを入手します-手動でフォローし、長期変数と重要な関数呼び出しを強調表示します。

~~~ AND/OR ~~~

5運が良ければ、デバッガーでコードの実行を開始し、一度に1行ずつステップ実行します(ユーザーが作成したサブ関数にステップインします)。

この時点で、制御構造を通過する一般的なフローをたどることができます。私はすべてが何をしているのかよくわからないかもしれませんが、何が起こっているのかについてはまともな考えがあります。

通常、私の目標はバグを見つけて解決し、先に進むことです。あなたの目標は完全に異なるかもしれません。これは、私が何年にもわたって送信してきたさまざまなMATLABコードの断片をすばやく理解するために使用した方法です。

13
MatlabDoug

matlabのコーディング規約に関するいくつかの提案:

  1. addpathを使用して、ファイルの乱雑さを回避し、関数の分類を支援します

  2. 機能スクリプト用にsection_を分割するか、条件付き実行用に設定します。これは、モジュールのプラグイン/アウト、および再利用やコード参照にも役立ちます。

  3. 設定ファイルを使用してオプションをオンまたはオフにします

  4. 構成のアーキテクチャ設定の概要と手口があります
  5. ステータス/ readmeファイルを保持します(自分を新しいユーザーとして扱います。3か月後にコードに戻った場合、新しいユーザー自身のモジュールの一部またはソリューションの一部としてシームレスに同化できるようにするにはどうすればよいですか?失われたか、追跡できません-何かが間違っています。)私の提案:巧妙なプロジェクトを維持することについてのあなたの考えを洗練するために日記をつけてください。あなたの芸術を完成させ続けてください!
  6. 方程式の場合は、ドキュメントにラテックスを使用します(ドキュメントなどのタイトルの近くのフォルダーに保存し、簡単にアクセスして追跡できるようにします。ドライブで「検索」を使用する必要がある場合は、プロジェクト管理に問題があります)
  7. コードをローカリゼーション用の短いモジュールと短いコードに分割し、スクロールを少なくすると、コードの追跡が容易になります。
  8. 意味のある変数と関数名を使用し(Javaスタイルは素晴らしいようです。例: 'backedupDataForVerification')、単語を短くするためにスティントしないでください。後で苦しむことになります。
  9. 設計では、関数、スクリプト、またはOO(オブジェクト指向)を使用する必要があるかどうかを再考してください
  10. スピードmatlabは最良の選択ではないため、時期尚早の最適化を急がないでください。本当に必要な場合は、左右の読みやすさを比較するために最適化されていないバージョンを保持してください。トラブルシューティングとデバッグはそれほど呪いではありません。
  11. 常に、常に、常にあなたのコードにコメントしてください。時間がないという言い訳は絶対に使わないでください。後でもっと時間を無駄にします。
  12. 区別するために、コード変更用の新しいノードを設定することを検討してください。バージョンを区別するためにツリーを設定します。

  13. 入力/出力、画像、中間結果などには別のフォルダを使用してください。

  14. タイムスタンプを使用してバージョンをトレースする

  15. コードを他の人と共有します。他の人が保守、使用、変更が難しい場合は、ビルドを改良する方法を再考してください。

7
Ursa Major

MATLABプログラミングスタイルガイドライン リチャードジョンソンによる優れたリソースです。

7

すべてをバックアップするのは正しいです。元のソースツリーの元のtarballを作成し、それをすべてソース管理にスローして、変更を追跡およびロールバックできるようにします。

静的な依存関係を検出するMatlabのdepfun()とdepdir()を見てください。 Matlab関数間の依存関係を確認するのに役立ちます。すべてのファイルに「depfun-toponly」を使用し、文字列を少し変更することで、即時の依存関係のリストを作成し、それをGraphVizファイルにスローして、コードベースの呼び出し接続の大きな有向グラフを作成できます。グラフ内のクラスターは、コードを分割するのに適した場所です。 (編集:Jonasのソリューションを参照してください。m2htmlがこれを行うように見えます。)

コードを書き直す余裕がある場合は、関連する関数を一緒にパッケージ化し、カプセル化する方法として、クラスメソッドとプライベート関数を備えたステートレスユーティリティクラスを使用して、コードの一部をオブジェクトとして書き直すことを検討してください。私はこのように編成された大きなMatlabコードベースを使用してきましたが、問題なく動作します。従来のMatlabでは、クラスはある種のパッケージを実行する唯一の方法です。 Matlabの新しいOOシステムにも名前空間がサポートされていると思います。

コードをOOに変換したくない場合は、関連する関数をサブディレクトリに整理できます。これは、少なくともソースコードの閲覧用に整理するのに役立ちます。

すべての関数には、H1行を含む、Matlabの標準ヘルプテキスト形式のドコが必要です。そうでない場合は、そこで学んだことについてコメントを付けてください。次に、「contentsrpt」ツールを使用して、クラスまたはディレクトリの目次ファイルを自動的に生成します。

幸運を。

3
Andrew Janke

Matlabが最新のソフトウェアソースコードの構造化をひどくサポートしていないというコメントのほとんどに同意しますが、少しの規律で独自の構造を課すことはそれほど難しいことではないと思います。

別のプログラミング言語で記述されたプログラムのソースファイルと同様に、ソースファイルをディレクトリの階層に編成します。階層に固執する必要はありません。必要に応じて独自の構造を選択してください。 setpathコマンド(またはそれが呼び出されるもの)を使用して、作業中にmファイルを探す場所をMatlabに指示します。

スパゲッティコードの解読に役立つコールグラフ(ひどくグラフィカルではなく、gprofのコールグラフのようなもの)を提供できるMatlabプロファイラーツールをよく理解してください。

もちろん、すべてのmファイルはリポジトリにあり、そこから提供します。ネットワークドライブの1つにプライベートツールボックスを保持し、すべてのユーザーがそのツールボックスの「リリース済み」コードを直接呼び出すことができます。