在matlab或插件/应用程序或技巧中是否有选项,如果您处于交互式命令会话中,每次打印出一个太大而无法让人看的矩阵,它会将输出编辑为警告矩阵有多大或矩阵的汇总(只有几行和几列)?
有很多次我想在命令窗口中检查一个矩阵,但我没有意识到它有多大,所以我不小心将整个事情打印出来.或者在函数内部的某些地方,我没有自己编码,有人错过了分号,我把它交给了一个大矩阵,它将整个东西转储到我的命令窗口.
有意义的是,在99.99%的时间里,人们不打算在交互式命令窗口中打印一百万行矩阵,对吧?它完全阻止了它们的滚动缓冲区,并删除了之前在屏幕上显示的所有有用信息.
因此,matlab更自然地假设交互式会话中的用户想要输出大矩阵的摘要,而不是将整个事物转储到命令窗口中.在设置中至少应该有这样的选项.
有时我会启动一个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) 首先,这里是我调用函数的方式:
eval([functionName '(''stringArg'')']); % functionName = 'someStringForTheFunctionName'
Run Code Online (Sandbox Code Playgroud)
现在,我functionName在我的路径中有两个功能,一个接受stringArg另一个功能,另一个接受其他功能.我遇到了一些错误,因为现在它找到的第一个错误是没有错误的函数stringArg.考虑到我调用functionName函数的方式,如何调用正确的函数?
编辑:
我试过这个功能which:
which -all someStringForTheFunctionName
Run Code Online (Sandbox Code Playgroud)
结果 :
C:\........\x\someStringForTheFunctionName
C:\........\y\someStringForTheFunctionName % Shadowed
Run Code Online (Sandbox Code Playgroud)
阴影函数是我想要调用的函数.
如上所述这里,我创建了自己figure.m这很好地重载内置figure命令.现在,每当我启动MATLAB时,我都会收到警告
警告:函数C:\ somepath\figure.m与MATLAB内置函数同名.我们建议您重命名该函数以避免潜在的名称冲突.
有没有办法停用此警告,因为在我的情况下它是理想的行为?
您可能会说我应该以不同方式调用我的函数而不是重载,但我觉得我的开发系统这种重载是正确的方法...
更新
正如Aabaz所提到的,您可以使用全局关闭此警告
warning off MATLAB:dispatcher:nameConflict
Run Code Online (Sandbox Code Playgroud)
需要在matlabrc.m(在设置路径之前)的开始处进行.但是,我仍然会对一个解决方案感兴趣,该解决方案可以特定地删除此错误消息以重载figure.m(或一些自定义的函数列表)而不是所有函数.我猜我在这里要求太多了一些;-)?
是否可以围绕与原始函数具有完全相同名称的函数创建包装器?
这在用户想要在输入变量传递到内置函数之前对输入变量进行一些额外检查的情况下非常有用.如何在显示非常大的数组时挂起MATLAB IDE?
matlab ×5
overloading ×2
built-in ×1
function ×1
heap-memory ×1
interactive ×1
java ×1
jvm-crash ×1
overriding ×1
wrapper ×1