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

时间:2014-06-04 15:55:19

标签: dynamic-typing type-systems matlab

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

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

感谢。


'1' 

是matlab中的1乘1字符矩阵和

'123' 

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

正如所料,

1

返回1-by-1 double。


现在如果我输入

'1' + 1

如果我输入

,我将获得50作为1对1的双倍
'123' + 1

我得到1乘3的双倍

[ 50 51 52 ]

此外,如果我输入

'a' + 1

结果是

98

以1比1的双倍。

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

感谢。

2 个答案:

答案 0 :(得分:6)

在MATLAB中,字符串只是ASCII字符的向量。您可以在wikipedia上查看有关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

答案 1 :(得分:3)

评论者直接点击头部:“1”的ASCII代码为49.您可以在C中看到相同的行为:

printf("%d", '1' + 1);

你会得到50。

您可以使用class()函数查看变量的类型:

octave:1> a = '1'
a = 1
octave:2> b = 1
b =  1
octave:3> class(a)
ans = char
octave:4> class(b)
ans = double
octave:5> c = [1 2 3]
c =
   1   2   3

octave:6> class(c)
ans = double
octave:7> d = '123'
d = 123
octave:8> class(d)
ans = char

因此,当您添加两个时,它会将char转换为double,并为您提供结果。

octave:9> class(a + b)
ans = double

最后,您可以使用whos函数为您提供有关交易的更多信息

octave:10> whos
Variables in the current scope:

   Attr Name        Size                     Bytes  Class
   ==== ====        ====                     =====  =====
        a           1x1                          1  char
        ans         1x6                          6  char
        b           1x1                          8  double
        c           1x3                         24  double
        d           1x3                          3  char