You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:38:22