Matlab中如何通过变量名字符串获取内容并筛选结构体变量
嘿,我来帮你搞定MATLAB里这个结构体筛选和合并的需求~ 下面分步骤给你讲清楚怎么操作:
第一步:筛选工作区里的所有结构体变量
要找出工作区中所有的结构体,我们可以用whos函数获取所有变量的详细信息,然后通过类型筛选:
% 获取工作区所有变量的完整信息 var_details = whos; % 用来存结构体变量名的空数组 struct_var_names = {}; % 挨个检查每个变量的类型 for idx = 1:length(var_details) if strcmp(var_details(idx).class, 'struct') struct_var_names{end+1} = var_details(idx).name; end end
这样struct_var_names里就存了所有结构体变量的名字(比如'struct_1'、'struct_2'这些字符串)。
第二步:通过字符串变量名获取内容并合并
拿到变量名之后,我们可以用evalin(比直接用eval更安全,明确指定从基础工作区获取变量)来获取每个结构体的内容,然后把它们合并成一个新的结构体:
% 初始化最终的合并结构体 final_merged_struct = struct(); % 遍历每个结构体变量名 for name = struct_var_names current_name = name{1}; % 根据字符串变量名获取对应的结构体 current_struct = evalin('base', current_name); % 把当前结构体作为final_merged_struct的一个字段,字段名就是原变量名 final_merged_struct.(current_name) = current_struct; end
做完这步,final_merged_struct.struct_1就是原来的struct_1,final_merged_struct.struct_2就是原来的struct_2,以此类推,所有结构体都被整合到一个大结构体里了。
更简洁的写法(一行式筛选)
如果想少写几行代码,可以用逻辑索引直接筛选whos的结果,再结合arrayfun和cell2struct完成合并:
% 一步获取所有结构体变量名 struct_var_names = {whos('*').name}([whos('*').class] == 'struct'); % 直接合并成目标结构体 final_merged_struct = cell2struct(... arrayfun(@(x) evalin('base', x), struct_var_names, 'UniformOutput', false), ... struct_var_names, ... 2);
额外提醒:尽量避免滥用eval类函数
虽然上面的方法能解决问题,但如果可以的话,最好从一开始就把结构体集中存放,比如直接放在一个结构体或者单元格数组里,而不是分散在工作区:
% 一开始就把所有结构体放在一个大结构体里 my_structs = struct(); my_structs.struct_1 = struct('field1', "str", 'field2', 0:5); my_structs.struct_2 = struct('field1', "str", 'field2', 0:10); my_structs.struct_3 = struct('field1', "str", 'field2', 0:20);
这样后续要合并或者操作的时候,直接用my_structs就行,不用再去遍历工作区,既安全又高效。
如果是要合并字段(而非保留原结构体作为子字段)
如果你想要的不是把每个结构体作为子字段,而是把所有结构体的字段合并到同一个结构体里(前提是字段名不冲突,否则后面的会覆盖前面的),可以这么写:
final_merged_struct = struct(); for name = struct_var_names current_name = name{1}; current_struct = evalin('base', current_name); % 遍历当前结构体的所有字段,合并到结果中 field_list = fieldnames(current_struct); for field = field_list final_merged_struct.(field{1}) = current_struct.(field{1}); end end
内容的提问来源于stack exchange,提问作者LearnToGrow
相关产品推荐
相关产品推荐

