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变量有关,但它究竟是如何处理这些?数据是否实际上是统一的和标记的,或者它是如何工作的?
感谢。
答案 0 :(得分:6)
在MATLAB中,字符串只是ASCII字符的向量。您可以在wikipedia上查看有关ascii的更多信息。
混合字符和双精度时,MATLAB会将字符转换为等效的ASCII数并返回结果。因此'1'
变为49
和49 + 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