在Matlab上有一件我不喜欢的东西:它有时会过于聪明。例如,如果我有一个负平方根,如
a = -1; sqrt(a)
Matlab不会抛出错误,而是静默切换到复数。负对数也会发生同样的情况。这可能导致在更复杂的算法中难以发现错误。
类似的问题是Matlab“解决”静默非二次线性系统,如下例所示:
A=eye(3,2); b=ones(3,1); x = A \ b
显然x
不满足A*x==b
(它解决了最小二乘问题)。
是否有可能关闭“功能”,或者至少让Matlab在这种情况下打印警告信息?在许多情况下,这确实会有很大帮助。
答案 0 :(得分:3)
我不认为你的例子中有“聪明”之类的东西。负数的平方根很复杂。类似地,左除运算符在Matlab中定义为计算非正方形输入的伪逆。
如果您的应用程序不应该返回复数(请注意浮点错误!),那么您可以使用isreal
来测试它。如果您不希望左除法运算符计算伪逆,请测试A
是否为正方形。
或者,如果由于某种原因您实际上无法进行输入验证,则可以使sqrt
和\
重载以仅处理正数,并且不计算伪逆。
答案 1 :(得分:3)
您需要了解所写内容的所有含义,并确保在保证良好代码的情况下使用正确的函数。例如:
realsqrt
代替inv(A) * b
代替或者,在调用内置函数之前/之后包括适当的检查。如果你每次都需要这样做,那么你总是可以编写自己的函数。