Scilab中脉冲神经元模拟器FOR循环生成空矩阵问题
解决Scilab脉冲神经元模拟器的空矩阵相加警告问题
问题原因
当某次循环中没有神经元达到放电阈值(v>=30)时,fired会成为空矩阵。此时执行sum(S(:,fired),"c")会返回空矩阵,和I相加就会触发operation +: Warning adding a matrix with the empty matrix will give an empty matrix result.警告,最终导致I变为空矩阵,后续v和u的计算也会全部变为空值。
修复方案
在执行I=I+sum(S(:,fired),"c")之前,先判断fired是否为空。若为空则跳过相加操作,若不为空再执行求和相加。
修改后的代码
Ne=8; Ni=2; re=rand(Ne,1); ri=rand(Ni,1); a=[0.02*ones(Ne,1); 0.02+0.08*ri]; b=[0.2*ones(Ne,1); 0.25-0.05*ri]; c=[-65+15*re.^2; -65*ones(Ni,1)]; d=[8-6*re.^2; 2*ones(Ni,1)]; S=[0.5*rand(Ne+Ni,Ne), -rand(Ne+Ni,Ni)]; v=60*rand(10,1) v2=v u=b.*v; firings=[]; for t=1:20 I=[5*rand(Ne,1,"normal");2*rand(Ni,1,"normal")]; fired=find(v>=30); j = length(fired); h = t*ones(j,1); k=[h,fired']; firings=[firings;k]; v(fired)=c(fired); u(fired)=u(fired)+d(fired); // 仅当fired非空时执行求和相加 if ~isempty(fired) then I=I+sum(S(:,fired),"c"); end v=v+0.5*(0.04*v.^2+5*v+140-u+I); v=v+0.5*(0.04*v.^2+5*v+140-u+I); u=u+a.*(b.*v-u); end plot(firings(:,1), firings(:,2),".");
补充说明
- 首次循环正常是因为恰好有神经元放电,
fired非空,不会触发空矩阵相加问题;后续循环可能出现无神经元放电的情况,进而触发警告并导致数据为空。 - 加入
isempty(fired)判断后,可避免空矩阵参与运算,保证v、u和I始终保持正确的矩阵维度,程序能完整运行20次循环并生成预期的脉冲点图。
内容的提问来源于stack exchange,提问作者paul dirac
相关产品推荐
相关产品推荐

