在MATLAB中遍历结构体,但不使用'fieldnames'

7
通常在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中类似的方法吗?

1
我认为Matlab中没有与Octave的那个整洁特性相对应的功能。如果你只需要在所有值上运行单个函数,那么structfun可以帮助你。 - Jonas
更准确地说,我需要将一个向量分配给mystruct的值部分,即用[10, 11, 12]替换值3、5、9,以此类推。我还不知道在这种情况下如何使用structfun语句。有什么提示吗?这是否是将结构体转换为第一步?是否存在一个简单的函数(没有{}出现!)可以将1x1结构转换为1x3形式:struct('key',{'a','b','c'},'val',{3,5,9}) - unndreay
从MATLAB R2015b开始,这段代码应该可以工作。除了一些其他单元数组支持代码生成之外,还增加了对fieldnames的支持。 - Ryan Livingston
2个回答

3
编辑:从MATLAB R2015b开始,MATLAB Coder支持为单元数组和fieldnames函数生成代码。因此,OP显示的代码片段完全支持代码生成。

R2015b之前的答案

MATLAB函数{{link1:structfun}}支持使用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的调用。


请注意,尽管structfun支持代码生成,并且支持函数句柄,但匿名函数不支持,这将严重限制此解决方案的适用性。 - Sam Roberts

3
生成 MATLAB Coder 或 Simulink Coder 代码时,不能使用单元数组,并且也不能使用动态名称引用结构体字段。
由于无法使用动态名称,您应该为每个字段名称重复执行循环体的内容,这样(由于您不使用动态名称)您将事先知道。
虽然从编程角度来看可能比较麻烦,但我猜测在生成代码时可能会更快,因为代码生成过程应该会展开循环。

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