在Matlab中关闭“智能行为”

时间:2011-12-14 13:51:04

标签: matlab warnings behavior

在Matlab上有一件我不喜欢的东西:它有时会过于聪明。例如,如果我有一个负平方根,如

a = -1; sqrt(a)

Matlab不会抛出错误,而是静默切换到复数。负对数也会发生同样的情况。这可能导致在更复杂的算法中难以发现错误。

类似的问题是Matlab“解决”静默非二次线性系统,如下例所示:

A=eye(3,2); b=ones(3,1); x = A \ b

显然x不满足A*x==b(它解决了最小二乘问题)。

是否有可能关闭“功能”,或者至少让Matlab在这种情况下打印警告信息?在许多情况下,这确实会有很大帮助。

2 个答案:

答案 0 :(得分:3)

我不认为你的例子中有“聪明”之类的东西。负数的平方根很复杂。类似地,左除运算符在Matlab中定义为计算非正方形输入的伪逆。

如果您的应用程序不应该返回复数(请注意浮点错误!),那么您可以使用isreal来测试它。如果您不希望左除法运算符计算伪逆,请测试A是否为正方形。

或者,如果由于某种原因您实际上无法进行输入验证,则可以使sqrt\重载以仅处理正数,并且不计算伪逆。

答案 1 :(得分:3)

您需要了解所写内容的所有含义,并确保在保证良好代码的情况下使用正确的函数。例如:

  • 对于第一种情况,请使用realsqrt代替
  • 对于第二种情况,请使用inv(A) * b代替

或者,在调用内置函数之前/之后包括适当的检查。如果你每次都需要这样做,那么你总是可以编写自己的函数。