Matlab:如何捕获警告

问题描述 投票:0回答:3

我正在 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

matlab warnings
3个回答
11
投票

您需要指定警告标识符,而不是警告文本。您可以使用

lastwarn
:

的两个输出形式找到标识符
[msgstr, msgid] = lastwarn

就您而言,我认为您想要的标识符是

'MATLAB:rankDeficientMatrix'


7
投票

您可以尝试使用

lastwarn
作为替代方案。除法之后,调用它并将其与
strcmp
与通常的警告消息进行比较,如果它是您想要的,您可以使用
error
手动抛出您想要的错误。

正如您所建议的:您可以重置

lastwarn
抛出空警告
warning('')


0
投票

以下内容紧密实现了 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.'

分步骤

  1. 存储
    warning
    状态以便稍后恢复
  2. 设置
    warning('off', warn_id)
    以允许执行而不显示警告
  3. 执行
    fn()
    获取其输出,但通过
    evalc
    抑制打印语句。
  4. 设置
    warning('error', warn_id)
    以便下一次
    fn()
    执行触发警告但不打印它
  5. 再次执行
    fn()
  6. 通过
    lastwarn
  7. 检索警告
  8. 恢复警告状态
  9. 同时返回
    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
© www.soinside.com 2019 - 2024. All rights reserved.