Matlab分段函数报错‘Index exceeds the number of array elements’求助
问题排查:Matlab分段函数构建报错"Index exceeds the number of array elements"
尝试在Matlab中创建分段函数V(t)、D(t),先确定分段点,再基于t的分段构建函数并绘图。运行代码时出现报错:"Index exceeds the number of array elements. Index must not exceed 51",原代码如下:
z=zeros(1,50); p_i=zeros(1); p=0.023; for i=1:50 z(i)=rand; if z(i)>p p_i(end+1)=i+z(i); end end n=numel(p_i); V=zeros(1,n); w=zeros(1,n); D=zeros(1,n); V_op=zeros(1,n); %get the number of pi sigma_w0=0.2; Q=5; P=2; Q_op=4; for i=1:n if i>1 w(i)=w(i-1)+normrnd(0,sigma_w0); V(i)=Q*w(i); D(i)=P*w(i); V_op(i)=Q_op*w(i); else w(1)=2; V(i)=Q*w(i); D(i)=P*w(i); V_op(i)=Q_op*w(i); end end t=0:0.0002:50; V_p=zeros(size(t)); D_p=zeros(size(t)); V_opp=zeros(size(t)); for m=1:length(t) t(m)>=p_i(i)& t(m)<p_i(i+1) V_p(m)=V(i); D_p(m)=D(i); V_opp(m)=V_op(i); end
报错原因分析
- 最后一个循环中
i变量未定义且未做区间匹配遍历:直接使用前一个循环的i值,当i等于n时,p_i(i+1)会超出数组长度,触发索引越界。 - 分段点初始化冗余:
p_i=zeros(1);会生成一个长度为1的零元素,导致后续分段点前多了无效的0,干扰区间判断。 - 区间判断逻辑缺失:原代码中的
t(m)>=p_i(i)& t(m)<p_i(i+1)只是一个表达式,没有用if包裹,不会执行赋值逻辑。
修复后的代码
z=zeros(1,50); p_i=[]; % 初始化为空数组,避免多余的0元素 p=0.023; for i=1:50 z(i)=rand; if z(i)>p p_i(end+1)=i+z(i); end end % 补充首尾分段点,确保覆盖t的全区间[0,50] p_i = [0, p_i, 50]; n=numel(p_i); % 分段函数的段数比分段点少1,调整数组长度 V=zeros(1,n-1); w=zeros(1,n-1); D=zeros(1,n-1); V_op=zeros(1,n-1); sigma_w0=0.2; Q=5; P=2; Q_op=4; for i=1:n-1 if i>1 w(i)=w(i-1)+normrnd(0,sigma_w0); V(i)=Q*w(i); D(i)=P*w(i); V_op(i)=Q_op*w(i); else w(1)=2; V(i)=Q*w(i); D(i)=P*w(i); V_op(i)=Q_op*w(i); end end t=0:0.0002:50; V_p=zeros(size(t)); D_p=zeros(size(t)); V_opp=zeros(size(t)); for m=1:length(t) % 遍历分段点,找到当前t(m)所属的区间 for i=1:n-1 if t(m)>=p_i(i) && t(m)<p_i(i+1) V_p(m)=V(i); D_p(m)=D(i); V_opp(m)=V_op(i); break; % 找到区间后跳出循环,提升效率 end end end % 绘图验证分段函数效果 figure; subplot(3,1,1); plot(t, V_p); title('V(t)分段函数'); subplot(3,1,2); plot(t, D_p); title('D(t)分段函数'); subplot(3,1,3); plot(t, V_opp); title('V_op(t)分段函数');
修复说明
- 修正分段点初始化:将
p_i=zeros(1);改为空数组初始化,同时补充0和50作为首尾分段点,确保覆盖t的全部范围。 - 调整数组长度:分段函数的段数比分段点数量少1,因此将
V、w等数组的长度改为n-1,避免多余元素。 - 完善区间匹配逻辑:在遍历
t的循环中,增加对i的遍历,用if语句判断t(m)所属区间,匹配后赋值并跳出循环,彻底解决索引越界问题。 - 添加绘图代码:增加绘图模块,方便直观验证分段函数的效果。
内容的提问来源于stack exchange,提问作者wenwei
相关产品推荐
相关产品推荐

