我正在使用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.
虽然如果我在该行中设置断点,似乎可以使用预期效果执行表达式。
我的两(3)个问题:
(注意:我可以写循环,但是当我必须这样做时,我总觉得很痒:P)
答案 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