web-dev-qa-db-ja.com

Matlabで構造を定義する方法

構造は、次のようないくつかの方法で定義できることを知っています。

  1. 変数にフィールドを追加する

    p.color.red = .2;
    p.color.green = .4;
    p.color.blue = .7;
    
  2. 割り当てによるスカラー構造の定義

    S = struct('a',  0, 'b',  1, 'c',  2);
    

私ができることは、構造定義(Cなど)を作成することです。私の最終目標は、反復してテストを実行できる一連の構造を用意することです。一般的な構造を定義して、そのインスタンスを作成する方法はありますか?他のメカニズムを使用する必要があります。 MATLABがJavaをサポートしていることを知っていますが、クラス/インターフェイスを使用する必要がありますか?

19
Joel B

Cとは異なり、Matlabでは、構造体のメンバーを追加または削除できます。特定のフィールドを持つ構造体を特定の関数で使用できるのは、より慣例です。

つまり、これらは構造を作成する2つの基本的な方法です。もちろん、*。mファイルに関数を記述して、特定のフィールドを持つ構造を作成することもできます。または、さらにOOを取得したい場合は、 ここ を参照してください

6
aschepler

あなたの目標は同じタイプのいくつかの構造で作業することであると述べたので、利用可能な主な2つのアプローチとそれらの比較方法に注意する必要があります。

1)構造の配列

配列を動的に拡張して初期化できます

p(1).str = 'white';
p(1).r = 1;
p(1).g = 1;
p(1).b = 1;
p(2).str = 'black';
p(2).r = 0;
p(2).g = 0;
p(2).b = 0;

ただし、配列を事前に割り当てることから始めるのが常に良い

p = repmat( struct('r',[], 'g',[], 'b',[], 'str',[]), 1, 10);

事前に割り当てる別のトリック:

p(10) = struct('r',[], 'g',[], 'b',[], 'str',[]);

または、初期化時にすべての値を指定することもできます。

p = struct('r',{1 0}, 'g',{1 0}, 'b',{1 0}, 'str',{'white' 'black'});

値を入力する簡単な方法

names = {'white' 'black'};
[p(1:2).str] = names{:};
red = num2cell([1 0]);
[p(1:2).r] = red{:};

1つのフィールドのすべての値を取得する方法は次のとおりです。

red = [p(:).r];
names = {p(:).str};

2)配列の構造

p.r = [1 0];
p.g = [1 0];
p.b = [1 0];
p.str = {'white' 'black'};

p1 = [p.r(1) p.g(1) p.b(1)];

これの利点は、構造がポインタの配列にすぎないことです(r、g、b、strはメモリに個別に格納されます)。これを、構造体の配列があり、各構造体がそのフィールドへのポインターを持っている(メモリオーバーヘッドがかなりある)前のアプローチと比較してください。

>> s1 = repmat( struct('r',0, 'g',0, 'b',0), 1, 1000);
>> s2 = struct('r',zeros(1,1000), 'g',zeros(1,1000), 'b',zeros(1,1000));
>> whos
  Name      Size               Bytes  Class     Attributes

  s1        1x1000            204192  struct              
  s2        1x1                24372  struct              

一方、構造体の各フィールドは独自の配列として格納されるため、フィールドの長さが一致している必要があるという事実を強制するのはユーザーの責任です。

あなたがこれについてもっと読みたいなら、いくつかの他の投稿:

32
Amro