是否有MATLAB函数可以检查MATLAB结构中是否存在字段?

1,620次浏览(过去30天)
如果存在具有特定名称的结构,则'exist'函数返回true。如果字段位于结构数组中,函数将返回true。然而,我想要一个函数来确定一个字段是否存在于结构的结构中的任何地方。例如,在下面的代码中,'isfield'函数不能识别"c"是"a"的字段。
A.B.C = 1;
isfield (,“c”
结果:
ans =
0

接受的答案

MathWorks支援小组
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
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
返回
结束
结束
结束
结束

登录评论。

更多答案(3)

比尔康纳利
比尔康纳利 2015年10月30日
为了以防将来有人沿着这条线走,你可以在一行中实现同样的事情
如果sum (strcmp(字段名(结构),的字段名) == 1
%做某事
结束
5个评论
沃尔特·罗伯森
沃尔特·罗伯森 2019年2月6日
Videoinput是一个对象而不是一个结构,所以它可以有类似字段名的属性,也可以有非公共字段。

登录评论。


安德鲁•米勒
安德鲁•米勒 2017年5月19日
我需要同样的解决方案来解决这个问题,并决定将其上传到Matlab Central。希望能有所帮助!
前提是:宽度优先搜索以查找任何事件,并在第一个事件上bug退出,返回它所发生的层数,将S视为结构节点树。

哲李
哲李 2017年10月19日
一个(简单的)解决方法是使用 try - catch 结构,并寻找MATLAB:nonExistentField错误标识符。

2022世界杯八强谁会赢?

世界杯预选赛小组名单社区寻宝

在MATLAB Central中找到宝藏,并发现社区如何帮助您!世界杯预选赛小组名单

开始狩猎!

Baidu
map