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

4

2 回答 2

3

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

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

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

于 2014-06-18T12:32:00.227 回答
3

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

前 R2015b 答案

MATLAB 函数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.

于 2014-06-18T12:32:08.783 回答