是否可以向Matlab添加自定义dbstop
条件?
最近我发现自己在多个变量中有超出界限的值,追踪第一次出现的一种方法是在更新这些值的每一行上设置一个条件断点。但是,我希望有一种更简单的方法可以做到这一点。
我最近不得不追踪一个NaN
因为以下原因而非常简单:
dbstop if naninf
因此,我希望有可能得到类似的东西:
dbstop if anything outside myBound
或
dbstop if myVariable outside myBound
我当然愿意接受人们所期望的性能打击。
答案 0 :(得分:4)
如果您使用编辑器,您可以设置正常停止,右键单击它,选择“设置/修改条件”并输入条件(停止将从红色变为黄色)。
从命令行,您可以使用
dbstop in file if expression
dbstop in file at location if expression
e.g.
dbstop in myFile at 200 if (~isempty(var) && var > 3)
如@LuisMendo所述。
第二个选项可能更有用,因为第一个选项似乎只在文件的开头进行评估。换句话说,似乎不可能有一个类似通用的表达式dbstop if naninf
来检查整个文件中的某些值。
答案 1 :(得分:2)
在dbstop
中使用“如果是EXPRESSION的FILESPEC中的DBSTOP”形式的问题是它仅在文件的第一行行设置断点。解决方案是使用“LINENO中的文件中的DBSTOP(如果是EXPRESSION”)在每个行设置断点。
考虑以下示例脚本,保存在名为testfile.m
的文件中。
clear all
for m = 1:10;
k = 2*m
end
假设我们想要在变量k
超过值6
时停止。我们首先在此文件的所有行中自动设置断点:
file = 'testfile.m';
varname = 'k';
expression = 'k>6'; %// it should be 'exist(''k'')&&k>6', but that's added later
%// Determine number of lines of file:
fid = fopen('testfile.m');
cont = 1;
nlines = 0;
while cont
readline = fgetl(fid);
cont = ~isequal(readline,-1);
nlines = nlines + cont;
end
fclose(fid);
%// Set breakpoint at each line. We need eval for this
for n = 1:nlines
eval(['dbstop in ' file ' at ' num2str(n) ' if ( exist(''' varname...
''') && ( ' expression ' ) )'])
end
现在,在运行上述内容后(检查testfile.m
的每一行是否有黄色断点),运行testfile
并在值停止时检查值:
如果你有几个变量或文件,这肯定有点麻烦。另外,我不确定Matlab支持多少个同时断点(我们每个程序行使用一个断点)。
答案 2 :(得分:0)
在盒子外思考 - 你可以写一个类来保存你的变量。在那里你可以有一个自定义的setter,如果你违反边界就会发出警告。 dbstop if warning
应该足够了。