我的实验室里有很多MATLAB代码.问题是没有办法组织它.由于所有函数都必须在同一个文件夹中调用(或者你必须在MATLAB的path环境变量中添加一堆文件夹),似乎我们注定在同一个文件夹中有大量文件,全都在全局命名空间.有没有更好的方法来组织我们的文件和功能?我真的希望有某种模块系统......
有时我会启动一个MATLAB脚本并意识到太晚了,它会输出太多的数字.最终我得到了一个
线程"AWT-EventQueue-0"中的异常java.lang.OutOfMemoryError:Java堆空间
这可以很容易地在我的机器上使用
for i=1:inf
figure;
end
Run Code Online (Sandbox Code Playgroud)
在使用128 MB Java堆的标准设置(首选项/ Java堆内存)崩溃之前,我得到大约90个数字,而将堆加倍到256 MB则给出了大约200个数字.
您是否看到了避免 Java错误消息的方法?如果没有足够的内存供另一个人使用,我希望我的脚本能够被告知而不是崩溃.
也许我可以有一个包装器figure(以某种方式?)检查有多少Java堆可用,如果没有足够的空间,它会拒绝打开一个新的数字?
更新
使用下面的答案,我得到了一个很好的图表,说明Memory Java有多少可用内容:
![figure; plot(freeMem/1E6,'x'); ylabel('java.lang.Runtime.getRuntime.freeMemory [MB]'); xlabel('创建的空数字');](https://i.stack.imgur.com/EMnHC.png)
这是使用
for i=1:inf
java.lang.Runtime.getRuntime.gc
fprintf('%3.0f: %1.0f Byte free\n',i,java.lang.Runtime.getRuntime.freeMemory);
figure;
end
Run Code Online (Sandbox Code Playgroud)
我假设开头的增加意味着垃圾收集每次调用它时只会做一些努力吗?
更新2 - 我的解决方案
使用我在这里获得的帮助,我实现了以下解决方案作为figure.m重载并调用内置figure命令:
function varargout=figure(varargin)
memcutoff = 10E6; % keep at least this amount of bytes free
memkeyboard= 3E6; % if memory drops below this, interrupt execution and go to keyboard mode
global refuse_new_figures
if refuse_new_figures
warning('jb:fig:lowjavamem2','Java WAS …Run Code Online (Sandbox Code Playgroud) 有时,根据图像的大小,当我addframe在MATLAB中调用2D图像添加到视频时,我收到以下警告消息.
警告:根据指定的编解码器的要求,帧高已填充为四的倍数.在127的avifile.addframe中
我的问题是:
有没有办法沉默像这样的特定警告?如果是这样,是否可以在我的代码中的变量中捕获警告(即类似于try&catch异常机制),而不是让MATLAB在命令窗口中打印此警告?
如果以上是不可能的.有没有办法暂时在MATLAB中静音所有警告?
假设我正在使用MATLAB IDE并且碰巧在我的工作空间中有一些非常大的对象(例如500k +元素的数组).现在,假设我愚蠢地偶然双击其中一个非常大的变量,这会触发对数组编辑器的加载.不幸的是,对于这么大的数组,MATLAB只是挂起.
我尝试过CTRL + C,CTRL + BREAK,CTRL + D,但似乎没有人能够中断IDE的行为.我知道我可以强制matlab退出,但是首先将所有这些变量读入工作区需要花费很多时间,而且我可能在编辑器窗口中有未保存的更改等.