我最近发现了一种奇怪的MATLAB单元阵列行为,以前没有发生过.
如果我创建一个单元格数组
a=cell(1,4)
Run Code Online (Sandbox Code Playgroud)
它的大小是32个字节.
如果那时我把东西放在里面,比如说
a{2}='abcd'
Run Code Online (Sandbox Code Playgroud)
它的大小变为144字节.但如果我通过放置删除此内容
a{2}=[]
Run Code Online (Sandbox Code Playgroud)
大小变为132字节,依此类推.问题是什么?
简而言之,Matlab单元阵列需要一些内部数据结构来跟踪存储的内容.
看起来,Matlab会根据需要分配内存,从而在插入数据时扩展单元阵列所需的存储空间.
删除数据并不意味着matlab可以将现在未使用的内存返回到操作系统或内部内存池 - 这可能是内部存储结构无法实现的,也可能是性能方面不明智的内容,因为从中删除数据的单元阵列(通过单元阵列的所有用例来说)是经常更新的结构,因此"过早地"返回内存只是为了再次获取它后面的一些指令将是相当CPU密集的.
总的来说:除了矩阵和稀疏矩阵之外,Matlab几乎所有的存储方法都非常糟糕(向量当然是矩阵的特殊情况).那是因为Matlab的工作不是像字符串解析器等.
如果内存成为一个问题,可能值得考虑在Matlab中实现问题的数学核心,并在其他更通用的编程语言中完成剩下的工作,并以某种方式将Matlab代码与其连接 - 我自己没有尝试过,但是Mathworks有一个用于python的 Matlab引擎,我每天都会使用Matlab编写python来存储任意数据.使用该引擎,您可以调用Matlab进行脏数学工作,并使用python进行日常脚本/编程工作.
请注意,我的底线是Matlab具有出色的数学例程和令人印象深刻的文档,但如果您想实际开发软件,使用通用工具/语言更有可能快速满足.
我甚至可以说,学习python可能值得花时间,只是为了能够规避必须处理Matlab不适合的事情(并且单元数组是Matlab实际上的一个主要例子)很复杂,在python中非常容易).