4

大量 (数千万) の MATLAB 構造体を処理する必要があります。十数個のフィールドが必要だったので、これを発見するまでメモリは問題にならないと考えました (説明)

>> s=[];
>> s.first=1;
>> whos
  Name      Size            Bytes  Class     Attributes

  s         1x1               132  struct              

>> s.second=2;
>> whos
  Name      Size            Bytes  Class     Attributes

  s         1x1               264  struct              

>> s.third=3;
>> whos
  Name      Size            Bytes  Class     Attributes

  s         1x1               396  struct

これは明らかに、何千万ものはるかに大きな構造体を使用することを妨げています。

クラスに頼ると、メモリ使用量の問題 (構造体配列ごとに 56 バイトのマークアップ) は解決されますが、オブジェクトの構築と破棄が非常に遅くなります。

軽量 (C 構造体のような) で高速な構造体を作成するにはどうすればよいですか?

4

4 に答える 4

2

(a) Pyrolistical が示唆するように、大きな配列を使用します (構造体 1 の「最初の」フィールドは「最初の」配列の要素 1、構造体 2 の場合は要素 2 など)。

(b) メモリ使用量をより適切に制御できる C++ (または Java) などの別の言語を使用することを検討してください。mex 関数を介して C++ コードにアクセスできます (これは少し難しい場合があります)。Java バイトコードを Matlab から直接評価できます。

于 2008-11-17T14:26:35.750 に答える
2

別のオプション: 非表示のグローバル構造体に配列の構造体を保持します。このグローバル構造体を掘り下げて、その 1 つのインスタンスだけに適用されるデータを切り出すクラス オブジェクトを作成します。

グローバル構造体は、PERSISTENT キーワードを使用したり、情報を隠すために private/ ディレクトリを使用したりすることで、よりきれいに実装できます。2008a 以降を使用している場合、新しいハンドル オブジェクト システムにより、実装がよりクリーンになります。

本当に大規模で複雑なデータ構造がある場合は、C++、Java、または numpy を使用した Python などの別の言語を真剣に検討します。私のタスクがMatlabにうまくマッピングされているとき、私はMatlabが大好きです。データ構造は、特に 2008a 以前の Matlab の長所の 1 つではありません。

于 2008-11-27T05:55:14.860 に答える
2

これらの構造体を配列に変換し、クラスを介してアクセサー メソッドを提供します。

于 2008-11-13T17:55:33.727 に答える
0

クラスとはどういう意味ですか?私が覚えている限りでは、クラスは matlab で型を表す用語でした。自己定義クラスを意味していると思います。

解決策 (matlab ドキュメントでも推奨されています) は、構造体の配列から配列の構造体に切り替えることです (R、G、B のリンクを参照してください) 例。

于 2008-11-13T16:23:35.750 に答える