有一个MATLAB函数,可以检查字段是否存在于一个MATLAB结构?

2417(30天)
“存在”函数返回true,如果存在一个结构与一个特定的名称。“isfield”函数返回true,如果一个字段是在一个结构数组中。然而,我想一个函数,用来决定字段是否存在任何结构的结构。例如,在下面的代码中,“isfield”函数不确定,“c”是一个“a”。
a.b。c = 1;
isfield (,“c”)
结果:
ans =
0

接受的答案

MathWorks支金宝app持团队
没有MATLAB函数,检查每一个层次的结构,结构或嵌套结构,以确定一个字段存在。“isfield”功能只检查一个嵌套结构的顶层。来确定一个字段存在在其他层面上,您可以使用下面的方法。
1。来确定一个字段存在于一个特定的子结构,使用子结构“isfield”而不是顶级。在这个例子中,一个的价值。b本身就是一个结构,你可以叫“isfield”。
a.b。c = 1;
isfield (a.b“c”)
ans =
逻辑
1
注意:如果第一个输入参数不是一个结构数组,然后“isfield”返回0(假)。虽然有其他MATLAB数据类型属性可以访问点符号,其他数据类型不是结构数组。
2。来确定各级领域存在嵌套结构,创建一个新的函数,检查所有级别的结构。打开MATLAB编辑器并粘贴下面的函数。作为一个MATLAB文件保存功能,名叫“myIsField.m”。
函数字段名isFieldResult = myIsField(指导)
%的名字是指导搜索的结构或数组结构
% fieldName的场函数的名称搜索
isFieldResult = 0;
f =字段名(指示(1));
i = 1:长度(f)
如果(比较字符串(f{我},strtrim(字段名)))
isFieldResult = 1;
返回;
elseifisstruct(指示(1)。(f{我}))
isFieldResult = myIsField(指示(1),(f{我}),字段名);
如果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 =字符串(in_field);
rootfieldnames =字符串(字段名(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(我)),current_searchfieldname);
如果out_isfieldresult = = true
返回;
结束
结束
结束
结束

登录置评。

更多的答案(3)

比尔康纳利
比尔康纳利 2015年10月30日
以防有人在这个线程在未来,你可以达到同样的事情在一行
如果sum (strcmp(字段名(结构),的字段名)= = 1
%做某事
结束
5个评论
沃尔特·罗伯森
沃尔特·罗伯森 2019年2月6日
videoinput是一个对象不是结构所以看起来可以有属性,字段名和它具有非公开字段。

登录置评。


安德鲁•米勒
安德鲁•米勒 2017年5月19日
编辑:MathWorks支金宝app持团队 2023年4月27日在25
我需要解决这个问题,决定上传到Matlab中央。希望它可以帮助!
前提是:广度优先搜索找到任何发生和第一个暴突,返回的数量水平下发生治疗年代struct-nodes树。

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

下载188bet金宝搏

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!