simulink报错:Simulink报错”Memory allocation error“的相关分析

一.问题的引入

  今天在调试模型时出现了该报错情况,具体情况如下图所示:

  

 

 

 

 

二.该问题的解决过程

 

1.逐个假如模块进行测试

    这种方法比较费力,其实可以先划定一个有嫌疑造成问题的模块范围,将之移掉,再每次添加一个模块,无连接的输出连至Terminal模块,直到有问题的模块出现。

    但试过之后发现,这种方法对现在出现得问题没有效果。你会发现:直到最后将Display模块(最后一个模块)添上后,就会出现该问题,但用Terminator模块代替Display模块,就不会出现问题。仔细检查,Display模块是没有问题的。其中的原因,后面解释。

 

2.网上资料查询

   感谢百度,感谢google。通过搜索,结合具体的出错提示,我意识到模型出现了这个问题:内存不够大,所以分配错误。

  出现这种错误的情况我知道了有两种:

  • 如有些人遇到的出现“代数环(Algebraic loops)”。这个可以用Tools-->simulink debugger,点击绿色运行按钮后查看右侧的提示信息有没有出现 "algebraic loop“相关信息;
  • 某些模块可能需要较大的内存。例如本模型中的Delay模块,延迟256帧,每一帧322272个double类型的数据,每个double类型的数据在matlab中分配8字节内存,总共需要322272*256*8=660013056字节的arrary。使用memory命令显示matlab中此时array可以允许的最大内存的结果如下:

>> memory Maximum possible array: 350 MB (3.675e+008 bytes) * Memory available for all arrays: 1031 MB (1.081e+009 bytes) ** Memory used by MATLAB: 652 MB (6.839e+008 bytes) Physical Memory (RAM): 2046 MB (2.146e+009 bytes)


有第一行信息可知,最大可能的array是350M=367500000字节,小于660013056字节,显然会产生错误,这也就是本模型中产生该错误的原因。

 

 

三.用Terminator模块代替Display模块没有报错的原因

    对于这个问题,我没有找到确凿的证据来解释原因,在此仅提出自己的一种理解:当用Terminator模块时,其输出结果我是没有意义的(这是由Terminator模块本身的性质决定的),所以我感觉Simulink此时应该少进行了一些操作,比如对具体结果的计算。而用Display模块时就不一样了,具体的结果需要显示,是很重要的。

 

 

四.总结——可能出现需要大内存的情况

  • 如前所述的"代数环"
  • 某些模块,如Delay模块、Scope模块(该模块中可以设定保存的点数,点数越多,所需内存越大)。  

你可能感兴趣的:(matlab)