查看: 464|回复: 1|关注: 0

[已解决] 如何检查 MATLAB 结构中是否存在某字段?

[复制链接]

21

主题

42

帖子

0

最佳答案
  • 关注者: 2
发表于 2019-7-12 14:24:47 | 显示全部楼层 |阅读模式
如果结构体存在,则 exist函数返回 true。如果结构体包含某字段,则 isfield 函数返回 true。

但是,我希望有一个函数来确定结构体中的任意位置是否存在某字段。

例如,在以下代码中,isfield 函数不认为 c 是 a 的字段,并返回结果0。
  1. a.b.c = 1;
  2. isfield(a, 'c')
复制代码

21

主题

42

帖子

0

最佳答案
  • 关注者: 2
 楼主| 发表于 2019-7-12 14:27:34 | 显示全部楼层
没有这样的函数。

isfield 函数仅检查结构体最顶层是否有特定字段,而不会检查其他层次。如果需要检查所有层次,可以使用以下方法:

方法1:对结构体其他层次执行 isfield,例如以下命令,将获得返回值 true。
  1. a.b.c = 1;
  2. isfield(a.b,'c')
复制代码

注意:如果 isfield 函数的第一个输入参数不是结构体,则运行结果为0。在 MATLAB 中有其他数据结构,也通过“.”运算获得下一层属性,但他们不一定是结构体。

方法2:自定义一个函数便利结构体的所有层次。例如函数 myIsField.m,其内容如下:
  1. function isFieldResult = myIsField (inStruct, fieldName)
  2. % inStruct is the name of the structure or an array of structures to search
  3. % fieldName is the name of the field for which the function searches
  4. isFieldResult = 0;
  5. f = fieldnames(inStruct(1));
  6. for i=1:length(f)
  7. if(strcmp(f{i},strtrim(fieldName)))
  8. isFieldResult = 1;
  9. return;
  10. elseif isstruct(inStruct(1).(f{i}))
  11. isFieldResult = myIsField(inStruct(1).(f{i}), fieldName);
  12. if isFieldResult
  13. return;
  14. end
  15. end
  16. end
复制代码

调用时,将返回 true:
  1. a.b.c = 1;
  2. myIsField(a,'c')
复制代码


答案来源:
https://ww2.mathworks.cn/matlabcentral/answers/95923-is-there-a-matlab-function-that-can-check-if-a-field-exists-in-a-matlab-structure


您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐上一条 /3 下一条

快速回复 返回顶部 返回列表