Matlab循环中通过少量if语句实现分段连续求和的方法
原有代码问题
- 区间判断存在边界遗漏:当
depart_time恰好等于100、200、300等边界值时,无法命中任何判断分支 - 后续区间求和逻辑错误:仅对当前单个
arrival(i)取值计算,没有实现区间范围内的累计,且每次进入分支都会覆盖变量之前的值,无法得到连续累计结果 - 条件判断重复冗余:多个elseif分支写法重复,后续调整区间边界时需要修改多处代码,容易出错
实现方案
根据需求分两种场景选择写法:
场景1:需要循环过程中动态更新累计值
和第一个分支的逻辑对齐——每遍历到一个元素,就更新当前区间从区间起始位置到当前遍历位置的累计和,直接用如下代码:
arrival=xlsread('tripinfo.xlsx','G:G'); depart_time=xlsread('tripinfo.xlsx','B:B'); % 初始化6个区间的累计值、各区间起始索引 mean_travel = zeros(6,1); sec_start = ones(6,1); % 定义区间边界,覆盖所有取值无遗漏 sec_edge = [0, 100, 200, 300, 400, 500, inf]; for i = 1:91 % 匹配当前值所属区间 for s = 1:6 if depart_time(i) >= sec_edge(s) && depart_time(i) < sec_edge(s+1) % 计算当前区间从起始点到当前遍历位置的累计和 mean_travel(s) = sum(arrival(sec_start(s):i, 1)); % 标记下一个区间的起始位置 if sec_start(s) == i && i > 1 sec_start(s+1) = i; end break end end end % 结果对应关系: % mean_travel(1) 对应 depart_time ∈ [0,100) 区间累计 % mean_travel(2) 对应 depart_time ∈ [100,200) 区间累计 % mean_travel(3) 对应 depart_time ∈ [200,300) 区间累计 % mean_travel(4) 对应 depart_time ∈ [300,400) 区间累计 % mean_travel(5) 对应 depart_time ∈ [400,500) 区间累计 % mean_travel(6) 对应 depart_time ∈ [500,+∞) 区间累计
场景2:仅需要最终每个区间的arrival总和
不需要写循环,直接用Matlab的逻辑索引筛选对应区间的元素求和即可,代码更简洁,运行效率更高:
arrival=xlsread('tripinfo.xlsx','G:G'); depart_time=xlsread('tripinfo.xlsx','B:B'); mean_travel1 = sum(arrival(depart_time < 100)); mean_travel2 = sum(arrival(depart_time >= 100 & depart_time < 200)); mean_travel3 = sum(arrival(depart_time >= 200 & depart_time < 300)); mean_travel4 = sum(arrival(depart_time >= 300 & depart_time < 400)); mean_travel5 = sum(arrival(depart_time >= 400 & depart_time < 500)); mean_travel6 = sum(arrival(depart_time >= 500));
注意:区间的等号边界可以根据实际需求调整,只要保证所有边界值都能被覆盖、不会出现重复判断即可。
内容的提问来源于stack exchange,提问作者arashrad
相关产品推荐
相关产品推荐

