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)