Matlab:为什么'1'+ 1 == 50?

zui*_*iqo 5 matlab type-systems dynamic-typing

Matlab的动态类型很弱,这就是造成这种奇怪行为的原因.我不明白的是究竟发生了什么,因为这个结果让我感到惊讶.

编辑:为了澄清,我所描述的显然是Matlab以ASCII格式存储字符的结果,这也在评论中提到.我对Matlab处理变量的方式更感兴趣,特别是它如何以及何时为值分配类型/标记.

谢谢.


'1' 
Run Code Online (Sandbox Code Playgroud)

是matlab中的1乘1字符矩阵

'123' 
Run Code Online (Sandbox Code Playgroud)

是一个1乘3的字符矩阵.

正如所料,

1
Run Code Online (Sandbox Code Playgroud)

返回一个1乘1.


现在,如果我进入

'1' + 1
Run Code Online (Sandbox Code Playgroud)

我得到50作为1对1的双倍,如果我进入

'123' + 1
Run Code Online (Sandbox Code Playgroud)

我得到1比3的双倍

[ 50 51 52 ]
Run Code Online (Sandbox Code Playgroud)

此外,如果我输入

'a' + 1
Run Code Online (Sandbox Code Playgroud)

结果是

98
Run Code Online (Sandbox Code Playgroud)

以1比1的双倍.

我假设这与matlab如何以ascii形式存储char变量有关,但它究竟是如何处理这些?数据是否实际上是统一的和标记的,或者它是如何工作的?

谢谢.

Ste*_*eve 6

在MATLAB中,字符串只是ASCII字符的向量.你可以在维基百科上看到关于ascii的更多信息.

混合字符和双精度时,MATLAB会将字符转换为等效的ASCII数并返回结果.所以'1'变得4949 + 1 = 50.

当你写'123' + 1这个,[49 50 51] + 1并且MATLAB正确计算结果,[50 51 52]因为标量数加上一个向量导致将标量数添加到向量的每个元素.

最后,'a'有整数值97所以这一切都解决了.

编辑:

请注意,您可以使用MATLAB命令str2double将字符转换为其实际数字表示,如下所示:

str2double('1') + 1
str2double('123') + 1
Run Code Online (Sandbox Code Playgroud)