使用函数/字符串访问复杂的matlab结构

时间:2015-05-14 12:49:12

标签: matlab

我有一个matlab结构,有几个级别(例如a.b(j).c(i).d)。我想写一个函数,它给我我想要的字段。如果结构只有一个级别,那将很容易:

function x = test(struct, label1)
  x = struct.(label1)
end

E.g。如果我有结构a.b,我可以通过b获得test('b')。但是,这不适用于子字段,如果我有结构a.b.c我无法使用test('b.c')来访问它。

有没有办法将带有完整字段名称(带点)的字符串传递给函数来检索此字段?或者是否有更好的方法来获取我通过函数参数选择的字段?

目标?当然,对于一个fieldname来说,这将是一个无用的函数,但我不想传递一个字段列表作为参数来准确接收这些字段。

2 个答案:

答案 0 :(得分:2)

您应该使用subsref功能:

function x = test(strct, label1)
F=regexp(label1, '\.', 'split');
F(2:2:2*end)=F;
F(1:2:end)={'.'};
x=subsref(strct, substruct(F{:}));
end

要访问a.b.c,您可以使用:

subsref(a, substruct('.', 'b', '.', 'c'));

测试函数首先使用.作为分隔符拆分输入,并创建一个单元格数组F,其中每个其他元素都填充.,然后将其元素传递给{{ 1}}作为参数。

请注意,如果涉及substruct的数组,则会获得第一个数组。对于structs传递a.b(i).c(j).d将返回b.c.d。请参阅this question了解其处理方式。

作为旁注,我将输入变量a.b(1).c(1).d重命名为struct,因为strct是内置的MATLAB命令。

答案 1 :(得分:1)

一种方法是创建一个自我调用函数来执行此操作:

a.b.c.d.e.f.g = 'abc'
value = getSubField ( a, 'b.c.d.e.f.g' )

  'abc'

function output = getSubField ( myStruct, fpath )
  % convert the provided path to a cell
  if ~iscell(fpath); fpath = strread ( fpath, '%s', 'delimiter', '.' ); end
  % extract the field (should really check if it exists)
  output = myStruct.(fpath{1});
  % remove the one we just found
  fpath(1) = [];
  % if fpath still has items in it -> self call to get the value
  if isstruct ( output ) && ~isempty(fpath)
    % Pass in the sub field and the remaining fpath
    output = getSubField ( output, fpath );
  end
end