Scilab程序运行报错:维度不兼容问题排查与修复求助
解决Scilab分段函数绘图的维度不兼容错误
问题需求
需要在Scilab中绘制两个分段函数:
- x(t)分段规则:
- 0≤t<4时,x=(7/4)t
- 4≤t<6时,x=7
- 6≤t<14时,x=-t+13
- 14≤t<16时,x=-7
- 16≤t<20时,x=(7/4)t-7
- y(t)分段规则:
- 0≤t<2时,y=1
- 2≤t<4时,y=3
原代码运行时出现维度不兼容错误,以下是原代码:
m=10;N=2^m; T1=20; dt1=T1/N; t1=0:dt1:T1-dt1; t11=0:dt1:4-dt1; t12=4:dt1:6-dt1; t13=6:dt1:14-dt1; t14=14:dt1:16-dt1; t15=16:dt1:20-dt1; x11=(7/4)*t11; x12=7*ones(1,N/2); x13=-t13+13; x14=(-7)* ones(1,N/2); x15=(7/4)*t15-7; x=[x11 x12 x13 x14 x15]; T2=4; dt2=T2/N; t21=0:dt2:2-dt2; t22=2:dt2:4-dt2; t2=[t21 t22] y21=1*ones(1,N/2); y22=3*ones(1,N/2); y=[y21 y22]; figure(1,'BackgroundColor',[1,1,1]); plot2d2(t1,x,5); plot2d2(t2,y,3)
错误原因
原代码手动拆分t区间时,错误地用N/2固定生成ones数组的长度,但各区间的实际点数并不等于N/2:
- 例如x(t)的4≤t<6区间时长为2,总时长T1=20,对应点数应为
length(t12),而非N/2; - y(t)的0≤t<2区间时长为2,总时长T2=4,对应点数应为
length(t21),而非N/2; - 这种硬编码长度的方式导致拼接后的x、y数组长度与对应的t数组长度不匹配,触发维度错误。
修正方案
方案1:使用逻辑索引(推荐)
直接对完整的t数组通过逻辑条件赋值,无需手动拆分区间,自动保证维度匹配:
m=10;N=2^m; // 处理x(t) T1=20; dt1=T1/N; t1=0:dt1:T1-dt1; x = zeros(size(t1)); // 初始化与t1同维度的数组 x(t1 >=0 & t1 <4) = (7/4)*t1(t1 >=0 & t1 <4); x(t1 >=4 & t1 <6) = 7; x(t1 >=6 & t1 <14) = -t1(t1 >=6 & t1 <14)+13; x(t1 >=14 & t1 <16) = -7; x(t1 >=16 & t1 <20) = (7/4)*t1(t1 >=16 & t1 <20)-7; // 处理y(t) T2=4; dt2=T2/N; t2=0:dt2:T2-dt2; y = zeros(size(t2)); // 初始化与t2同维度的数组 y(t2 >=0 & t2 <2) =1; y(t2 >=2 & t2 <4) =3; // 绘图 figure(1,'BackgroundColor',[1,1,1]); plot2d2(t1,x,5); plot2d2(t2,y,3);
方案2:修正手动拆分的长度计算
如果坚持手动拆分区间,需用对应t子数组的长度生成ones数组,确保拼接后总长度匹配:
m=10;N=2^m; T1=20; dt1=T1/N; t1=0:dt1:T1-dt1; t11=0:dt1:4-dt1; t12=4:dt1:6-dt1; t13=6:dt1:14-dt1; t14=14:dt1:16-dt1; t15=16:dt1:20-dt1; x11=(7/4)*t11; x12=7*ones(size(t12)); // 用t12的维度生成数组 x13=-t13+13; x14=(-7)*ones(size(t14)); // 用t14的维度生成数组 x15=(7/4)*t15-7; x=[x11 x12 x13 x14 x15]; T2=4; dt2=T2/N; t21=0:dt2:2-dt2; t22=2:dt2:4-dt2; t2=[t21 t22]; y21=1*ones(size(t21)); // 用t21的维度生成数组 y22=3*ones(size(t22)); // 用t22的维度生成数组 y=[y21 y22]; figure(1,'BackgroundColor',[1,1,1]); plot2d2(t1,x,5); plot2d2(t2,y,3);
内容的提问来源于stack exchange,提问作者daladers
相关产品推荐
相关产品推荐

