没有括号的函数sqrt()返回奇怪的值

Dov*_*Dov 1 matlab octave

我只是偶然在Octave中键入以下内容:

sqrt 25
Run Code Online (Sandbox Code Playgroud)

并回来了:

ans =
    7.0711   7.2801
Run Code Online (Sandbox Code Playgroud)

使用括号,sqrt(25)返回正确的结果.没有括号的情况会发生什么?MATLAB是否共享相同的行为或仅特定于Octave?我没有MATLAB所以我无法检查.

Hug*_*lan 7

Octave将其解释为length-2 char数组,并将它们转换为ASCII表示(50和53),然后获得平方根.这可以在MATLAB中使用:

 sqrt(double('25'))
Run Code Online (Sandbox Code Playgroud)

sqrt在没有括号的情况下使用时,MATLAB会产生一个未为char输入定义的错误.


小智 5

这是因为可以在matlab中调用函数的双重方式.例如,加载,保存等,所有这些工具都可以作为函数或命令调用.从而,

load('foo.bar')
load foo.bar
Run Code Online (Sandbox Code Playgroud)

两者都是使用负载的有效方法.

当函数用作命令时,它假定输入是字符串.所以

sqrt 25
Run Code Online (Sandbox Code Playgroud)

理论上会尝试在传递的字符串中取向量元素的平方根,然后将它们转换为从char中加倍.查看发生了什么的简单方法是将字符串'25'转换为其ascii等效项.

+'25'
ans =
    50    53
Run Code Online (Sandbox Code Playgroud)

当然,现在应该不足为奇了

sqrt([50 53])
ans =
       7.0711       7.2801
Run Code Online (Sandbox Code Playgroud)

它在MATLAB中失败而不是Octave只是说TMW现在已经插入了对sqrt的字符输入的错误检查(因此这确实会导致错误,而不是那些从未见过这种情况的难以调试的问题.毕竟,角色的平方根没有任何意义.并且没有理由想要计算字符的ascii等价的平方根.所以在逻辑上错误是在命令形式中使用sqrt时会发生什么.)