我正在 MATLAB 中运行一些数据处理工作,求解器使用 BACKSLASH 运算符。有时,我会收到这样的警告:
Warning: Rank deficient, rank = 1390, tol = 1.335195e-010.
Warning: Rank deficient, rank = 1386, tol = 1.333217e-010.
我想捕捉这些警告。 我正在尝试将警告转换为错误,然后按照标题“捕获警告”下的描述捕获它: http://undocumentedmatlab.com/blog/trapping-warnings-efficiently 在示例中,使用以下字符串将警告转换为错误:
s = warning('error', 'MATLAB:DELETE:Permission');
但是,我不确定我的情况使用什么字符串。我尝试使用
s = warning('error', 'Warning: Rank deficient’);
但是,它不起作用。 任何帮助将不胜感激。
问候, DK
您需要指定警告标识符,而不是警告文本。您可以使用
lastwarn
: 的两个输出形式找到标识符
[msgstr, msgid] = lastwarn
就您而言,我认为您想要的标识符是
'MATLAB:rankDeficientMatrix'
。
以下内容紧密实现了 Python 的等效项
with warnings.catch_warnings(record=True) as ws:
fn_out = fn()
warn_out = ''
for w in ws:
if 'blah' in w.message:
warn_out = w.message
它执行
fn()
两次,抑制其打印语句(例如 disp
),并确保恢复警告状态。要求 warning()
语句使用警告 ID,即 warning('a:b', msg)
语法。
fn = @()delete('beep'); % target function
warn_id = 'MATLAB:DELETE:FileNotFound'; % target warning ID
o = execute_and_catch_warning(fn, warn_id); % application
[fn_out, warn_out] = o{:} % fetch function output and warning message
fn_out =
NaN
warn_out =
'File 'beep' not found.'
warning
状态以便稍后恢复warning('off', warn_id)
以允许执行而不显示警告fn()
获取其输出,但通过 evalc
抑制打印语句。warning('error', warn_id)
以便下一次 fn()
执行触发警告但不打印它fn()
lastwarn
fn()
的输出和警告消息,如out = {fn_out, warn_out}
还会发生更多事情(例如
try
-catch
),但这就是想法。
function out = execute_and_catch_warning(fn, warn_id) %#ok<INUSD>
s = warning;
warning('off', warn_id);
try
% first try assuming `fn()` has an output
[~, fn_out] = evalc('fn()'); % suppress print statements
catch
% this is in case `fn()` has no output
warning(s); % restore prematurely in case `fn()` errors again
evalc('fn()');
fn_out = nan;
end
warning('error', warn_id);
try
evalc('fn()'); % suppress print statements
warn_out = "";
catch
warn_out = lastwarn;
end
warning(s) % restore warning state
out = {fn_out, warn_out};
end