【问题标题】:Why is the FOR loop in my program producing empty matrices?为什么我程序中的 FOR 循环会生成空矩阵?
【发布时间】:2023-02-02 17:50:38
【问题描述】:

我在运行尖峰神经元模拟器时遇到问题。我不断收到错误消息,“operation +: Warning adding a matrix with the empty matrix will give an empty matrix result.”现在我正在“Scilab”中编写这个程序,但我希望我遇到的问题对于受过教育的女警来说是清楚的。我所做的是将现有的 MATLAB 程序转换为 Scilab。可以在这里找到原始的 MATLAB 程序和解释:https://www.izhikevich.org/publications/spikes.pdf

在我的 Scilab 版本中,第一次通过循环会产生所有预期值。我知道这一点,因为我在第一次运行结束时按下暂停键,就在“结束”之前,然后检查所有值和矩阵元素。但是,如果我正确运行程序,其中包括一个 20 次迭代的循环,我会收到上面的错误消息,并且所有矩阵值都是空的!我不知道是什么问题。我对编程还很陌生,所以据我所知答案可能非常简单。这是该程序的 Scilab 版本:

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);
    
    I=I+sum(S(:,fired),"c");
    
    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),".");

我尝试了一切都无济于事。该程序应运行 20 次迭代,并生成代表在 20 个时间步长中的每个时间步长被激发的神经元的点的“光栅图”。

【问题讨论】:

    标签: scilab


    【解决方案1】:

    您可以添加以下行

    oldEmptyBehaviour("on")
    

    在脚本的开头,以防止默认的 Scilab 规则(任何具有空矩阵的代数运算都会产生一个空矩阵)。但是,您仍然会收到一些警告(尽管结果会正常)。作为最终修复,我建议在您的代码中测试 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);
        
        if ~isempty(fired)    
            j = length(fired);
            h = t*ones(j,1);
            k=[h,fired'];
            
            firings=[firings;k];
    
            v(fired)=c(fired);
            u(fired)=u(fired)+d(fired);
            
            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),".");
    

    【讨论】:

      【解决方案2】:

      [] + 1 在数学意义上并没有真正定义。根据您使用的软件,操作可能会失败或产生不同的结果。例如:

      • Scilab 5 [] + 1 产生 1
      • Scilab 6 [] + 1 生成 [] 和一个警告
      • Julia 1.8 [] .+ 1 产生 [][] + 1 一个错误。
      • Python+Numpy 1.23 np.zeros((0,0)) + 1 生成 []

      我建议检查 size() 或与空矩阵进行比较以避免这种奇怪的行为。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-09-21
        • 2019-11-11
        • 1970-01-01
        • 2013-07-30
        • 1970-01-01
        • 2016-08-21
        • 2023-03-23
        相关资源
        最近更新 更多