同时为多个结构体字段赋值

6

我有一个遵循以下模式的matlab结构:

S.field1.data1
          ...
 .field1.dataN
   ...
 .fieldM.data1
          ...
 .fieldM.dataN

我希望能够同时从所有字段中为一个数据字段(例如data3)分配值。这在语义上类似于:

S.*.data3 = value

通配符 "*" 代表结构体中的所有字段 (field1,...,fieldM)。在MATLAB中是否可以不使用循环来完成此操作?

3个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
4

由于field1 .. fieldM是具有相同字段的结构体数组,为什么不为“field”创建一个结构体数组呢?然后你就可以使用deal轻松设置所有“data”成员的特定值。

field(1).data1 = 1;
field(1).data2 = 2;
field(2).data1 = 3;
field(2).data2 = 4;

[field.data1] = deal(5);
disp([field.data1]);

3
一种基于循环的解决方案可以更加灵活和易于阅读:
names = strtrim(cellstr( num2str((1:5)','field%d') ));    %'# field1,field2,...
values = num2cell(1:5);                                   %# any values you want

S = struct();
for i=1:numel(names)
    S.(names{i}).data3 = values{i};
end

是的 @Amro,使用循环是我的备选计划。只是我们习惯了在 Matlab 中循环不好的教条。借助 JIT 编译或许并非如此,但我想知道是否有一行代码的解决方案。 - foglerit
1
@jonnat:向量化对于大型计算非常有用,而你的只是一个简单的赋值语句。所以即使你想出一行代码,我怀疑它的速度比这个直接的循环要快不了多少。 - Amro
也许在更一般的情况下,最好使用 fieldnames,而不是手动分配 names - Yuval Atzmon

0
在简单的情况下,您可以使用struct2cell()将结构体转换为单元数组来实现。但由于您有一个嵌套结构,我认为这种方法在这里行不通。 另一方面,您的数据为什么要以这种方式进行结构化?您的描述给人的印象是一个简单的MxN数组或单元数组更加合适。

示例中的结构非常简化。我的代码结构复杂,无法转换为单元格。即使可能,它也是 API 的一部分,我不能修改它。 - foglerit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,