是否有MATLAB函数可以检查MATLAB结构中是否存在字段?
1,620次浏览(过去30天)
显示旧的注释
如果存在具有特定名称的结构,则'exist'函数返回true。如果字段位于结构数组中,函数将返回true。然而,我想要一个函数来确定一个字段是否存在于结构的结构中的任何地方。例如,在下面的代码中,'isfield'函数不能识别"c"是"a"的字段。
A.B.C = 1;
isfield (,“c”)
结果:
ans =
0
接受的答案
MathWorks支援小组
2017年6月12日
没有MATLAB函数检查结构的结构或嵌套结构的每一层,以确定字段是否存在。isfield函数只检查嵌套结构的顶层。要确定字段是否存在于任何其他级别,可以使用以下方法之一。
1.要确定某个字段是否存在于特定的子结构中,请在该子结构上使用'isfield'而不是顶层。在这个例子中,a.b的值本身就是一个结构,你可以对它调用'isfield'。
A.B.C = 1;
isfield (a.b“c”)
ans =
逻辑
1
注意:如果第一个输入参数不是结构数组,那么'isfield'返回0 (false)。虽然有其他MATLAB数据类型具有可以用点表示法访问的属性,但那些其他数据类型不是结构数组。
2.若要确定某个字段是否存在于嵌套结构中的任何级别,请创建一个新函数来检查结构的所有级别。打开MATLAB编辑器,并将以下函数粘贴到其中。将函数保存为MATLAB文件,命名为'myIsField.m'。
函数isFieldResult = myIsField(指示,fieldName)
% instruction是要搜索的结构或结构数组的名称
% fieldName是函数要搜索的字段的名称
isFieldResult = 0;
f = fieldnames(指令(1));
为i = 1:长度(f)
如果(比较字符串(f{我},strtrim(字段名)))
isFieldResult = 1;
返回;
elseifisstruct(指示(1)。(f{我}))
isFieldResult = myIsField(指令(1).(f{i}), fieldName);
如果isFieldResult
返回;
结束
结束
结束
在一个嵌套结构上调用myIsField。
A.B.C = 1;
myIsField (,“c”)
ans =
逻辑
1
6个评论
broken_arrow
2021年9月19日
编辑:broken_arrow
2021年9月19日
我对它做了一点修改,也适用于多层
字段名
输入如
“公元前”
.我也支持扩展内建
isfield
相应的行动。
函数Out_isfieldresult = anyisfield(in_rootstruct,in_field)
%ANYISFIELD:内置isfield函数的扩展。添加功能:
% 1。多级输入(例如:“b.c.d”)
% 2。嵌套结构的任何级别的匹配标识
In_field = string(In_field);
Rootfieldnames = string(fieldnames(in_rootstruct(1)));
Out_isfieldresult = false;
如果包含(in_field“。”)
current_searchfieldname = extractBefore(in_field,“。”);
其他的
Current_searchfieldname = in_field;
结束
remaining_searchfieldnames = extractAfter(in_field,“。”);
为i = 1:长度(rootfieldnames)
如果比较字符串(rootfieldnames(我),current_searchfieldname)
如果ismissing (remaining_searchfieldnames)
Out_isfieldresult = true;
返回
其他的
Out_isfieldresult = anyisfield(in_rootstruct(1).(current_searchfieldname),remaining_searchfieldnames);
结束
elseifisstruct (in_rootstruct(1)。(rootfieldnames(我)))
Out_isfieldresult = anyisfield(in_rootstruct(1).(rootfieldnames(i)),current_searchfieldname);
如果Out_isfieldresult == true
返回;
结束
结束
结束
结束