我有一个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来说,这将是一个无用的函数,但我不想传递一个字段列表作为参数来准确接收这些字段。
答案 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