【问题标题】:Matlab: Why is '1' + 1 == 50?Matlab:为什么'1' + 1 == 50?
【发布时间】:2014-06-04 15:55:18
【问题描述】:

Matlab 的动态类型很弱,这就是导致这种奇怪行为的原因。我不明白到底发生了什么,因为这个结果真的让我很吃惊。

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

谢谢。


'1' 

是 matlab 中的 1×1 字符矩阵,

'123' 

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

正如所料,

1

返回一个 1×1 的双精度数。


现在如果我输入

'1' + 1

我得到 50 作为 1×1 双倍,如果我输入

'123' + 1

我得到一个 1×3 双倍

[ 50 51 52 ]

此外,如果我输入

'a' + 1

结果是

98

在 1×1 双精度中。

我认为这与 Matlab 如何以 ascii 形式存储字符变量有关,但它究竟如何处理这些?数据是否真正统一和标记,或者它是如何工作的?

谢谢。

【问题讨论】:

  • 猜测一下:'1' 字符的 ASCII 码是 49。49 + 1 是 50。
  • 你为什么不在 Stack Overflow 上提问? meta.stackexchange.com/a/129632/165773
  • 我了解ASCII编码,我对Matlab如何处理变量更好奇。这是语言设计的问题,而不是特定的编程问题,这就是我在这里问的原因。
  • @phi 这听起来像是特定于 Matlab 和 Matlab 的工作方式,这是一个技术问题。这就是 Stack Overflow 出现的原因。如果它是关于存在于多种语言中的更通用的语言特性,它可能与 P.SE 更相关。
  • @Panzercrisis 谢谢,我现在明白了。

标签: dynamic-typing type-systems matlab


【解决方案1】:

在 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

【讨论】:

  • 当 char(49) 变为 '1' 时,您可以使用函数“char”从 ascii 码转换为字符(或字符串)。您可以使用“abs”从 ascii 转换为 double,因为 abs('1') 变为 49。输入“帮助字符串”以获取更多信息。
【解决方案2】:

评论者一针见血:'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

【讨论】:

    猜你喜欢
    • 2018-08-21
    • 1970-01-01
    • 2011-03-11
    • 2015-01-08
    • 1970-01-01
    • 1970-01-01
    • 2021-01-09
    • 1970-01-01
    相关资源
    最近更新 更多