在没有' fieldnames'的情况下迭代MATLAB中的结构。

时间:2014-06-18 12:02:48

标签: matlab loops struct simulink matlab-coder

在MATLAB中迭代结构数据类型的常用方法是使用fieldnames()函数,如下所示:

mystruct = struct('a',3,'b',5,'c',9);

fields = fieldnames(mystruct);

for i=1:numel(fields)
  mystruct.(fields{i});
end

不幸的是,这总是生成单元格数据类型,我想在SIMULINK中使用这种迭代来进行Matlab功能块,因为代码生成原因不允许使用单元格数据类型。

有没有办法在不同时使用单元数据类型的情况下迭代结构?

在Octave中,https://www.gnu.org/software/octave/doc/interpreter/Looping-Over-Structure-Elements.html

中有一种简洁的方法
for [val, key] = mystruct
  # do something esp. with 'key'
end

有人在MATLAB中知道类似的方法吗?

2 个答案:

答案 0 :(得分:3)

使用MATLAB Coder或Simulink Coder生成代码时,不仅不允许单元格数组,而且还使用动态名称引用结构的字段。

由于你不能使用动态名称,你可能只需要多次重复循环体的内容,每个字段名称一次,因为你事先就知道了(因为你没有使用动态名称)。 / p>

虽然从编程的角度来看这可能很麻烦,但我猜想当你从它生成代码时它可能会稍微快一点,因为代码生成过程应该可能会解开循环。

答案 1 :(得分:3)

编辑:从MATLAB R2015b开始,MATLAB编码器支持为单元阵列和fieldnames函数生成代码。所以代码片段OP显示完全支持代码生成。

Pre R2015b回答

MATLAB函数structfunsupported,用于使用MATLAB Coder生成代码。如果将'UniformOutput'选项设置为false,则structfun的输出是与输入具有相同字段的结构。每个字段的值是将提供的函数句柄应用于输入结构中相应字段的结果。

mystruct = struct('a',3,'b',5,'c',9);
outstruct = structfun(@sin, mystruct, 'UniformOutput', false);

outstruct = 

    a: 0.1411
    b: -0.9589
    c: 0.4121

因此,您可以在示例中编写一个包含循环体的子函数,并将该子函数的句柄传递给structfun的调用。