在Matlab对象数组中设置属性

时间:2013-02-06 16:35:39

标签: matlab

我正在使用Matlab中的结构和对象数组。我想尽快为某个数组的所有成员设置属性。

对于设置某个结构字段的问题,我找到了一个涉及使用arrayfunsetfield的解决方案。以下工作就像一个魅力:

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.

虽然如果我在该行中设置断点,似乎可以使用预期效果执行表达式。

我的两(3)个问题:

  • 为什么上述解决方案失败?我怎样才能让它发挥作用?
  • 我的最终目标是在对象数组中设置属性快速简单。哪种技术最好?

(注意:我可以写循环,但是当我必须这样做时,我总觉得很痒:P)

2 个答案:

答案 0 :(得分:2)

我认为问题可能是你的阅读可能只是因为setfield也适用于班级。

无论如何还有一些选择,如果你的类继承自hgsetget,你可以使用set而不是setfield。

您也可以使用

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

而不是

setfield(x,'id',y)

答案 1 :(得分:0)

如果可以使用值的单元格,它将自动解释为struct array

>> 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