1

Matlabで構造体とオブジェクトの配列を操作しています。特定の配列のすべてのメンバーのプロパティをできるだけ速く設定したいと思います。

arrayfun特定の構造体フィールドを設定する問題については、とを使用することを含む解決策に到達しましたsetfield。以下は魅力のように機能します。

myStru.id = 0;
myStru.name = 'blah';
arrayStru = repmat(myStru,10,1);  % Array of 10 elements. All of them have id=0
arrayStru = cell2mat( arrayfun( @(x,y)setfield(x,'id',y), arrayStru, (1:10)', 'UniformOutput', false ) ); % ids ranging from 1 to 10 :D

問題は、オブジェクトの場合、これが機能しないことです。私はそれが構造物のためであることを理解してsetfieldいるので、私は他のいくつかの代替案を試しました。次のことを試してみると、最も厄介なエラーが表示されます。

arrayfun( @(x,y) eval(['x.id=y;']), arrayOfObjects, arrayOfValues, 'UniformOutput', false );

(このクラスは非常に単純なクラスであり、空のコンストラクターを受け入れ、「id」と呼ばれる実際のパブリックプロパティを持っています)。結果は次のようになります。

Error using setFieldOfStructArray>@(x,y)eval(['x.id=y;']) (line 17)
Error: The expression to the left of the equals sign is not a valid target for an
assignment.

ただし、その行にブレークポイントを設定すると、期待どおりの効果で式を実行できるようです。

私の2つ(3つ)の質問:

  • 上記の解決策が失敗するのはなぜですか?どうすればそれを機能させることができますか?
  • 私の最終的な目標は、オブジェクトの配列にプロパティをすばやく簡単に設定することです。これに最適なテクニックはどれですか?

(注:ループを書くことはできますが、そうしなければならないときはいつもかゆみを感じます:P)

4

2 に答える 2

2

setfieldはクラスでも機能するため、問題はあなたのプロパティが読み取り専用である可能性があることだと思います。

とにかく、いくつかの代替手段があります。クラスがhgsetgetから継承する場合は、setfieldの代わりにsetを使用できます。

使用することもできます

subsasgn(x,struct('type','.','subs','id'),y) 

それ以外の

setfield(x,'id',y)
于 2013-02-06T16:53:21.767 に答える
0

構造体配列として自動的に解釈される値のセルを使用できる場合

>> s = struct('a', num2cell(1:10)', 'b', 's')

s = 

10x1 struct array with fields:
    a
    b

>> [s.a]

ans =

     1     2     3     4     5     6     7     8     9    10

>> [s.b]

ans =

ssssssssss
于 2013-02-06T20:41:24.270 に答える