MATLAB中基于特定条件提取有效序列的代码问题排查
修正MATLAB单元格数组有效序列提取代码
需求说明
需要从单元格数组中提取满足以下条件的连续序列:
- 纯
'Sun'组成的序列,长度至少为7 - 仅由
'Rain'或'Cloud'组成的序列,长度至少为7
原代码问题
原代码在多个测试用例中输出不符合预期:
- Test1:输入
scores = {'Rain' 'Cloud' 'Sun' 'Sun' 'Sun' 'Sun' 'Sun' 'Sun' 'Sun' 'Rain'},预期输出valid_sequences = [3, 9],实际得到[3, 9; 2,10] - Test2:输入
scores = {'Sun' 'Rain' 'Cloud' 'Cloud' 'Rain' 'Cloud' 'Rain' 'Cloud' 'Sun'},实际返回多组错误结果 - Test3:输入
scores = {'Rain' 'Rain' 'Cloud' 'Cloud' 'Rain' 'Cloud' 'Sun' 'Cloud' 'Rain'},无符合条件序列但原代码可能误判
原代码如下:
scores = {'Rain' 'Cloud' 'Sun' 'Sun' 'Sun' 'Sun' 'Sun' 'Sun' 'Sun' 'Rain'}; sequence_start = 1; num_scores = numel(scores); valid_sequences = []; for j = 1:num_scores stage = scores{j}; if strcmp(stage, 'Sun') if j == num_scores sequence_length = j - sequence_start + 1; else sequence_length = j - sequence_start; end if sequence_length >= 7 valid_sequences = [valid_sequences; sequence_start+1, j]; end elseif ismember(stage, {'Cloud', 'Rain', 'Thunder'}) sequence_length = j - sequence_start; if sequence_length >= 7 && sum(ismember(scores(sequence_start:j), {'Cloud', 'Rain', 'Thunder'})) >= 7 valid_sequences = [valid_sequences; sequence_start+1, j]; end else sequence_start = j; end end if (num_scores - sequence_start + 1) >= 7 valid_sequences = [valid_sequences; sequence_start, num_scores]; end
问题分析
原代码核心逻辑缺陷:
- 未在遇到不同类型阶段时及时重置序列起始位置,导致跨类型统计长度
- 长度计算逻辑混乱,比如
Sun分支中错误计算了非连续段的长度 - 未明确区分当前序列的类型(Sun/Rain-Cloud),导致误将混合类型序列判定为有效
- 末尾的额外判断未检查序列类型,直接按长度加入,造成错误结果
修正后的代码
% 输入示例(可替换为其他测试用例) scores = {'Rain' 'Cloud' 'Sun' 'Sun' 'Sun' 'Sun' 'Sun' 'Sun' 'Sun' 'Rain'}; num_scores = numel(scores); valid_sequences = []; % 1. 将阶段映射为类型标签:0=Sun,1=Rain/Cloud,2=其他 type = zeros(1, num_scores); for i = 1:num_scores if strcmp(scores{i}, 'Sun') type(i) = 0; elseif ismember(scores{i}, {'Rain', 'Cloud'}) type(i) = 1; else type(i) = 2; end end % 2. 找到类型变化的位置,分割连续同类型序列段 diff_type = diff([type, 2]); % 末尾加2确保最后一段被捕获 change_indices = find(diff_type ~= 0); start_indices = [1, change_indices + 1]; end_indices = [change_indices, num_scores]; % 3. 遍历每个序列段,检查是否符合条件 for k = 1:length(start_indices) s = start_indices(k); e = end_indices(k); len = e - s + 1; current_type = type(s); % 检查条件1:纯Sun且长度≥7 if current_type == 0 && len >=7 valid_sequences = [valid_sequences; s, e]; % 检查条件2:纯Rain/Cloud且长度≥7 elseif current_type == 1 && len >=7 valid_sequences = [valid_sequences; s, e]; end end % 输出结果 disp(valid_sequences);
测试验证
- Test1:输出
[3, 9],符合预期 - Test2:无符合条件的序列,输出空矩阵
- Test3:无符合条件的序列,输出空矩阵
内容的提问来源于stack exchange,提问作者Maria
相关产品推荐
相关产品推荐

