我使用PCG迭代法求解方程Ax=b如下:
Ax=b
x = pcg(A,b,tol,maxit);
每次计算后,命令窗口中都会显示一条消息,说明已达到或尚未达到收敛。我试图禁用这条消息,因为我在运行时打印了一些关于代码的其他重要信息,而这些信息在PCG警告消息之间丢失了!通过FLAG选项,我试图解决这个问题,但我做不到。如果有人知道如何禁用这些消息,我将不胜感激。
u7up0aaq1#
实际上,pcg不发出警告,它使用sprintf将“正常”文本输出到命令窗口。按照SCMG的建议,禁用所有警告将无济于事(+请不要关闭所有警告...很容易找出是哪种警告,并在这种情况下仅禁用该类型警告)。通过查看pcg(edit pcg)的源代码或在MATLAB中快速尝试它,您会发现调用x = pcg(...)将创建此输出消息,而调用[x, fl, rr, it, rv] = pcg(...)将不会创建该输出。其原因可能是,如果只使用输出x,您可能会对此收敛信息感兴趣,而如果将它们保存在变量中,则可能会执行一些智能检查以确保收敛,因此不需要控制台中的值。
pcg
sprintf
edit pcg
x = pcg(...)
[x, fl, rr, it, rv] = pcg(...)
x
优雅方式:调用pcg并将该诊断信息保存到变量中
[x, fl, rr, it, rv] = pcg(A,b,tol,maxit);
并在MatLab中*检查收敛!否则抛出警告或错误!
Quick‘n’脏:如果您只是假设一切在所有条件下都可以工作,只需忽略这些值,并且根本不将它们保存到变量中:
[x,~,~,~,~] = pcg(A,b,tol,maxit);
h5qlskok2#
您只需通过以下方式禁用所有警告:
warning('off','all')
其他用于抑制警告的选项可以在here中找到。
kninwzqo3#
您可以使用以下命令禁用特定警告:
warning('off', 'MATLAB:pcg:tooSmallTolerance');
然后使用以下命令重新启用它:
warning('on', 'MATLAB:pcg:tooSmallTolerance');
**编辑:**下面的选项不太好,见末尾备注。
或者,我们可能希望使用Try/Catch块。然而,Try/Catch不适用于警告:它只适用于错误。undocumented Matlab feature允许我们将警告转换为错误:
warning('error', 'MATLAB:pcg:tooSmallTolerance'); % call this once
现在,我们可以这样做:
try x = pcg(inputs); catch me disp(me); % me is an MException: look inside to see how to use it end
我们甚至不需要包含“Catch”语句:只需运行try pcg(...) end就可以有效地抑制这里的警告(不是很好,但有时很有用)。
try pcg(...) end
**EDIT:**实际上,当我们将警告转化为错误时,函数PCG没有机会终止,因此它不会返回输出。因此,在TRY/CATCH块之后未定义x。
3条答案
按热度按时间u7up0aaq1#
实际上,
pcg
不发出警告,它使用sprintf
将“正常”文本输出到命令窗口。按照SCMG的建议,禁用所有警告将无济于事(+请不要关闭所有警告...很容易找出是哪种警告,并在这种情况下仅禁用该类型警告)。通过查看
pcg
(edit pcg
)的源代码或在MATLAB中快速尝试它,您会发现调用x = pcg(...)
将创建此输出消息,而调用[x, fl, rr, it, rv] = pcg(...)
将不会创建该输出。其原因可能是,如果只使用输出x
,您可能会对此收敛信息感兴趣,而如果将它们保存在变量中,则可能会执行一些智能检查以确保收敛,因此不需要控制台中的值。优雅方式:调用
pcg
并将该诊断信息保存到变量中并在MatLab中*检查收敛!否则抛出警告或错误!
Quick‘n’脏:如果您只是假设一切在所有条件下都可以工作,只需忽略这些值,并且根本不将它们保存到变量中:
h5qlskok2#
您只需通过以下方式禁用所有警告:
其他用于抑制警告的选项可以在here中找到。
kninwzqo3#
您可以使用以下命令禁用特定警告:
然后使用以下命令重新启用它:
**编辑:**下面的选项不太好,见末尾备注。
或者,我们可能希望使用Try/Catch块。然而,Try/Catch不适用于警告:它只适用于错误。undocumented Matlab feature允许我们将警告转换为错误:
现在,我们可以这样做:
我们甚至不需要包含“Catch”语句:只需运行
try pcg(...) end
就可以有效地抑制这里的警告(不是很好,但有时很有用)。**EDIT:**实际上,当我们将警告转化为错误时,函数PCG没有机会终止,因此它不会返回输出。因此,在TRY/CATCH块之后未定义
x
。