1

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

对于设置某个结构字段的问题,我找到了一个解决方案,涉及使用arrayfunand 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.

尽管我在该行中放置了一个断点,但似乎可以以预期的效果执行该表达式。

我的两(三)个问题:

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

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

4

2 回答 2

2

我认为问题可能是您的属性可能是只读的,因为 setfield 也适用于类。

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

你也可以使用

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