You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 08:45:24