Octave技术问询:如何按条目拆分元胞数组并分配唯一顺序标识符
Octave 元胞数组按连续值分组生成命名变量
完整解决方案代码
% 示例输入元胞数组,可替换为你的trackId trackId = {0,0,0,1,1,2,2,2,2}; % 初始化当前分组的目标值和元素列表 current_val = trackId{1}; current_list = {current_val}; % 从第二个元素开始遍历 for i = 2:length(trackId) if trackId{i} == current_val % 元素和当前分组值相同,加入列表 current_list = [current_list, {trackId{i}}]; else % 生成对应命名的变量并保存当前分组 var_name = sprintf('List_%d', current_val); eval([var_name, ' = current_list;']); % 重置当前分组的目标值和元素列表 current_val = trackId{i}; current_list = {current_val}; endif endfor % 处理循环结束后剩余的最后一组 var_name = sprintf('List_%d', current_val); eval([var_name, ' = current_list;']);
代码说明
原代码问题修正:
- 你之前的代码在遇到不同值时直接
break中断循环,导致只处理了第一组;改进后会继续遍历剩余元素,完成所有分组。 - 通过
sprintf生成List_xx格式的变量名,再用eval动态创建变量,实现按条目值分配唯一标识符的需求。
- 你之前的代码在遇到不同值时直接
关键逻辑:
- 用
current_val记录当前分组的目标值,current_list收集同组元素。 - 遍历过程中,遇到不同值就保存当前分组,然后重置分组状态继续处理后续元素。
- 循环结束后单独处理最后一组(因为循环内只有遇到不同值才会触发保存,最后一组没有后续元素触发保存)。
- 用
适配非数值元胞:
如果你的trackId是字符串元胞数组,把判断条件的==换成strcmp即可:if strcmp(trackId{i}, current_val)更安全的替代方案(推荐):
动态生成全局变量可能存在命名冲突风险,更推荐用结构体统一存储所有分组:result_struct = struct(); % 保存分组时替换为: result_struct.(var_name) = current_list;后续可通过
result_struct.List_0访问对应分组,管理更方便。
内容的提问来源于stack exchange,提问作者zach dalton
相关产品推荐
相关产品推荐

