Matlab如何遍历字符串数组循环批量创建拼接后的矩阵变量
Matlab批量拼接同前缀矩阵的规范实现方法
eval动态生成零散工作区变量的写法属于Matlab官方明确不推荐的反模式,存在调试困难、命名空间污染、JIT无法优化、易触发变量覆盖bug等问题,完全可以用更稳妥的结构化方案实现需求。
核心原则
- 优先用结构体、字典、元胞数组这类结构化容器存储同批次数据,不要在工作区动态生成零散命名的变量,后续访问、遍历、计算的可维护性和运行效率都远高于动态变量方案。
- 如果是从零开发的代码,从数据生成阶段就避免创建A1、A2这类带数字后缀的零散变量,从源头省去批量拼接的额外处理逻辑。
具体实现方案
方案1:结构体存储(兼容所有Matlab版本,最通用)
针对已经存在A1、A2、B1、B2这类历史遗留零散变量的场景,通过结构体统一存储拼接结果,代码如下:
% 已有的预定义矩阵(历史遗留场景) A1 = [1;2]; A2 = [3;4]; B1 = [5;6]; B2 = [7;8]; % 待处理的变量前缀列表 VarList = {'A', 'B'}; result = struct(); for ivar = 1:length(VarList) prefix = VarList{ivar}; % 自动匹配当前前缀下所有同组变量,无需硬编码后缀序号 matchVars = who([prefix '*']); mergeData = []; for iv = 1:length(matchVars) mergeData = cat(1, mergeData, evalin('base', matchVars{iv})); end % 拼接结果存入结构体对应字段 result.(prefix) = mergeData; end
后续需要访问拼接结果时,直接调用result.A、result.B即可,所有同批次结果统一存在result结构体中,不会污染工作区命名空间,遍历所有分组结果直接遍历结构体即可。
方案2:字典存储(适配R2022b及以上新版本Matlab)
新版本Matlab提供的原生dictionary类型支持字符串、数值等多种类型作为键,使用更灵活:
A1 = [1;2]; A2 = [3;4]; B1 = [5;6]; B2 = [7;8]; VarList = ["A", "B"]; result = dictionary(); for ivar = 1:length(VarList) prefix = VarList(ivar); matchVars = who(char(prefix + "*")); mergeData = []; for iv = 1:length(matchVars) mergeData = cat(1, mergeData, evalin('base', matchVars{iv})); end result(prefix) = mergeData; end
访问结果时直接调用result("A")、result("B")即可,无需做字段名合法性校验。
源头优化建议
如果是从零开始编写代码,不要创建A1、A2、B1、B2这类零散变量,从数据生成阶段就用元胞数组存储同组数据,比如将A组两个矩阵存入元胞:
A_group = {[1;2], [3;4]},拼接时仅需一行代码即可完成:A = cat(1, A_group{:}),不需要循环、字符串匹配或者动态执行代码,是最简洁稳定的实现方式。
内容的提问来源于stack exchange,提问作者Romalpa Akzo
相关产品推荐
相关产品推荐

