Labfans是一个针对大学生、工程师和科研工作者的技术社区。 | 论坛首页 | 联系我们(Contact Us) |
![]() |
![]() |
#1 |
高级会员
注册日期: 2019-11-21
帖子: 3,006
声望力: 66 ![]() |
![]()
我在交互式MATLAB控制台中发出以下命令:
>> foo = [1 inf]; >> dbstop if naninf >> foo 我现在的行为很奇怪:MATLAB似乎分成了两个不同的文件,但实际上并没有停止执行。这很慢,因为编辑器会在这两个文件之间反复切换,而Ctrl + C则不执行任何操作。输出为: 481 end 20 if ~isfloat(value) 20 if ~isfloat(value) 399 if numel(var) > numelLimit 20 if ~isfloat(value) 20 if ~isfloat(value) 399 if numel(var) > numelLimit 20 if ~isfloat(value) 20 if ~isfloat(value) 399 if numel(var) > numelLimit ... ... 然后它最终会在调试提示下停止,并带有一个非常长的(递归)堆栈,例如: dbstack In codetools/private/dataviewerhelper>upconvertIntegralType at 20 In codetools/private/dataviewerhelper at 9 In workspacefunc>createComplexScalar at 271 > In workspacefunc>num2complex at 241 In workspacefunc>getShortValueObjectJ at 230 In workspacefunc>getShortValueObjectsJ at 349 In workspacefunc at 21 In codetools/private/dataviewerhelper>upconvertIntegralType at 20 In codetools/private/dataviewerhelper at 9 In workspacefunc>createComplexScalar at 271 In workspacefunc>num2complex at 241 In workspacefunc>getShortValueObjectJ at 230 In workspacefunc>getShortValueObjectsJ at 349 In workspacefunc at 21 In workspacefunc>getStatObjectsJ at 399 In workspacefunc at 27 In codetools/private/dataviewerhelper>upconvertIntegralType at 20 In codetools/private/dataviewerhelper at 9 In workspacefunc>createComplexScalar at 271 In workspacefunc>num2complex at 241 In workspacefunc>getShortValueObjectJ at 230 In workspacefunc>getShortValueObjectsJ at 349 In workspacefunc at 21 In codetools/private/dataviewerhelper>upconvertIntegralType at 20 In codetools/private/dataviewerhelper at 9 In workspacefunc>createComplexScalar at 271 In workspacefunc>num2complex at 241 In workspacefunc>getShortValueObjectJ at 230 In workspacefunc>getShortValueObjectsJ at 349 In workspacefunc at 21 In workspacefunc>getStatObjectsJ at 399 In workspacefunc at 27 ... ... 在我的真实程序中,我尝试调试时得到的结果仍然相同,甚至更糟,以至于有时我遇到递归限制错误并中止,有时MATLAB完全崩溃。我真的很想能够dbstop if naninf下使用dbstop if naninf ,但是这几乎使它变得不可能,这让我感到难过。有什么建议吗? 在Linux上使用MATLAB 2009b 64位。 谢谢! 编辑: 我刚刚在MATLAB 2007b 32位Linux上尝试过: >> foo = [1 inf] foo = 1 Inf >> dbstop if naninf >> foo foo = 1 Inf >> foo = [1 inf] foo = 1 Inf >> >> t = foo(2) t = Inf 因此,如果故意将inf分配给变量时naninf似乎没有执行任何操作,请在dbstop处进行操作。 文档说: 当随后运行的任何MATLAB程序文件由于运算符,函数调用或标量赋值而产生的无限值(Inf)或非数字(NaN)值时,如果naninf则为dbstop或infnan则为dbstop停止执行在调试模式下的MATLAB,在遇到Inf或NaN的行之后立即暂停。 即使在我故意将inf分配给变量时(如上面的t = foo(2)或s = inf)还是“标量分配”是什么意思,这也不应该吗? 回答: 当您尝试在工作区中显示NaN或Inf值时,您看到的那个怪异的深度递归断点看起来像是在Matlab GUI中的断点上,该部分本身是用M代码实现的。 (这是与用户代码一起在Matlab VM中运行的Matlab IDE的缺点之一。)我可以重现。尝试关闭“桌面”菜单中的“工作区”视图,或者使用“桌面”>“桌面布局”>“仅命令窗口”切换到最小布局。 第二部分:对于在命令行直接输入的表达式,不会出现断点。如果将其放入脚本或函数中,则会遇到断点。例如: function repro_dbstop_naninf foo = Inf; foo = [1 Inf]; bar = foo(2); disp('last line'); 当您调用此函数时,它将在第2行和第4行(实际上)之后中断。 >> dbstop if naninf >> repro_dbstop_naninf NaN/Inf breakpoint hit for repro_dbstop_naninf on line 2. Stopping at next line. 2 foo = Inf; 3 foo = [1 Inf]; K>> 更多&回答... |
![]() |
![]() |