【问题标题】:Iterate through a structure in MATLAB without 'fieldnames'在没有“字段名”的情况下遍历 MATLAB 中的结构
【发布时间】:2014-08-08 17:19:17
【问题描述】:

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

【问题讨论】:

  • 我认为整洁的 Octave 功能在 Matlab 中没有等价物。如果您只需要对所有值运行一个函数,那么structfun 可以提供帮助。
  • 更准确的说,我需要给mystruct的值部分赋值一个向量,也就是将值3、5、9替换为[10、11、12],保持在例子。在这种情况下,我还不知道如何使用 structfun 语句来做到这一点。有什么提示吗?这可能是转换结构的第一步吗?是否存在用于将 1x1 结构转换为该 1x3 形式的简单函数(没有出现 {}!):struct('key',{'a','b','c'},'val',{3,5,9})
  • 从 MATLAB R2015b 开始,此代码应该可以工作。添加了对 fieldnames 的支持以及其他一些用于代码生成的元胞数组支持。

标签: matlab loops struct simulink matlab-coder


【解决方案1】:

编辑:从 MATLAB R2015b 开始,MATLAB Coder 支持为元胞数组和 fieldnames 函数生成代码。所以sn-p OP展示的代码完全支持代码生成。

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 的调用。

【讨论】:

  • 请注意,虽然structfun 支持代码生成,并且支持函数句柄,但不支持匿名函数,这将严重限制此解决方案的适用范围。
【解决方案2】:

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

由于您不能使用动态名称,您可能应该多次重复循环主体的内容,每个字段名称一次,您会提前知道(因为您没有使用动态名称)。

虽然从编程的角度来看这可能很麻烦,但我想当您从中生成代码时它可能会稍微快一些,因为代码生成过程可能无论如何都应该展开循环。

【讨论】:

    猜你喜欢
    • 2011-02-17
    • 1970-01-01
    • 2017-05-31
    • 1970-01-01
    • 1970-01-01
    • 2022-12-11
    • 1970-01-01
    • 2013-10-21
    • 1970-01-01
    相关资源
    最近更新 更多