查询结构体中指定字符串出现次数时遇非结构体数组字段引用报错
这个错误我太熟了!大概率是你访问结构体字段时没注意到某个层级其实是结构体数组,而不是单个结构体。咱们一步步来解决:
第一步:定位错误根源
报错Attempt to reference field of non-structure array的核心问题是:你试图访问字段的那个变量,根本不是结构体——要么是普通数值/字符串数组,要么是结构体数组但你没加索引指定具体元素。
先运行这两行代码确认每个层级的类型,帮你快速定位问题:
disp(class(mydata)); % 查看mydata本身是单个结构体,还是结构体数组 disp(class(mydata(1).myfield)); % 取数组第一个元素,检查myfield的类型
第二步:正确访问层级字段
根据上面的结果调整访问方式:
情况1:mydata是单个结构体
如果class(mydata)返回struct,那直接访问字段是没问题的,可能是你之前的变量赋值出错了。比如正确的单个结构体定义应该是这样:
% 单个字符串的子字段 mydata.myfield.mysecondfield = 'I eat apple every day, apple is my favorite'; % 或者字符串数组形式 mydata.myfield.mysecondfield = ["apple", "pear", "apple", "orange"];
情况2:mydata是结构体数组
如果class(mydata)返回struct但它是数组(比如size(mydata)显示[N 1]),那必须指定索引才能访问字段:
% 访问数组第一个元素的子字段 target_content = mydata(1).myfield.mysecondfield; % 要遍历所有元素的子字段,可以先转成元胞数组 all_subfields = {mydata.myfield.mysecondfield};
第三步:统计'apple'的出现次数
根据子字段的类型选择对应的统计方法:
- 单个字符串:用
strfind定位后统计数量
str_content = mydata.myfield.mysecondfield; apple_count = length(strfind(str_content, 'apple'));
- 字符串数组(MATLAB R2016b及以上):用
count函数更简洁直观
str_array = mydata.myfield.mysecondfield; apple_count = sum(count(str_array, 'apple'));
- 元胞数组(来自结构体数组遍历):循环逐个统计后累加
all_subfields = {mydata.myfield.mysecondfield}; total_count = 0; for s = all_subfields total_count = total_count + length(strfind(s{1}, 'apple')); end
额外提醒
- 检查字段名拼写,别把
myfield写成myfiled这种低级错误; - 如果你的结构体里混合了数值和字符串类型的字段,访问时要注意过滤:比如某个数组元素的
myfield是数值,那访问.mysecondfield肯定会报错,得先跳过这类元素。
内容的提问来源于stack exchange,提问作者dede
相关产品推荐
相关产品推荐

