1

是否可以像向量一样以数字方式遍历 MATLAB 结构而不是使用字段名称?

简单地说,我试图在 Simulink 的 EML 块中执行以下操作:

S.a.type = 1;
S.a.val = 100;
S.a.somevar = 123;    
S.b.type = 2;
S.b.val = 200;
S.b.somevar2 = 234;
S.c.type = 3;
S.c.val = 300;
S.c.somevar3 = 345;

for i = 1:length(s)
    itemType = S(i).type;
    switch itemType
        case 1
            val = S(i).val * S(i).somevar1;
        case 2
            val = S(i).val * S(i).somevar2;
        case 3
            val = S(i).val * S(i).somevar3;
        otherwise
            val = 0
    end
end

disp(var);
4

2 回答 2

2

您应该能够使用 sprintf 使用类似以下内容动态生成字段名:

for i = 1:length(s)
    theFieldName = sprintf('somevar%d', S(i).type);
    val = S(i).val * getfield(S(i), theFieldName);
end
于 2011-09-21T20:14:02.350 回答
1

您需要使用字段名称,但您可以动态使用。如果您的结构定义为:

s.field1 = 'foo';
s.field2 = 'bar';

然后您可以使用以下field1任一方式访问该字段

s.field1
s.('field1')

您唯一需要的是fieldnames动态获取字段名称的函数,以便您的代码示例看起来有点像

elements = fieldnames(S);
for iElement = 1:numel(elements)
   element = S.(elements{iElement});
   itemType = element.type;
   switch itemType
      case 1
          val = element.val * element.somevar1;
      case 2
          val = element.val * element.somevar2;
      case 3
          val = element.val * element.somevar3;

   end
end

如果这些是确切的字段名称,您应该做一些其他的事情。首先,您需要重新考虑您的名字,其次您可以使用 Matt 的部分解决方案来简化您的代码。

于 2011-09-21T20:49:47.303 回答