Matlab: почему «1» + 1 == 50?

Matlab имеет слабую динамическую типизацию, что и вызывает такое странное поведение. Чего я не понимаю, так это того, что именно происходит, так как этот результат меня очень удивляет.

Изменить: Чтобы уточнить, то, что я описываю, явно является результатом того, что Matlab хранит символы в формате ASCII, что также упоминалось в комментариях. Меня больше интересует, как Matlab обрабатывает свои переменные, и, в частности, как и когда он присваивает значениям тип/тег.

Спасибо.


'1' 

представляет собой матрицу символов 1 на 1 в Matlab и

'123' 

представляет собой матрицу символов 1 на 3.

Как и ожидалось,

1

возвращает двойное значение 1 на 1.


Теперь, если я войду

'1' + 1

Я получаю 50 как удвоение 1 на 1, и если я ввожу

'123' + 1

Я получаю двойной 1 на 3

[ 50 51 52 ]

Кроме того, если я наберу

'a' + 1

результат

98

в дубле 1 на 1.

Я предполагаю, что это связано с тем, как Matlab хранит переменные char в форме ascii, но как именно он их обрабатывает? Действительно ли данные объединены и помечены, или как это работает?

Спасибо.


person zuiqo    schedule 04.06.2014    source источник
comment
Предположительно: код ASCII для символа «1» равен 49. 49 + 1 равно 50.   -  person Martijn Pieters    schedule 04.06.2014
comment
почему вы не спросили в Stack Overflow? meta.stackexchange.com/a/129632/165773   -  person gnat    schedule 04.06.2014
comment
Я понимаю кодировку ASCII, мне больше интересно, как Matlab обрабатывает переменные. Это проблема дизайна языка, а не конкретный вопрос программирования, поэтому я спрашиваю здесь.   -  person zuiqo    schedule 04.06.2014
comment
@phi Похоже, это специфично для Matlab и того, как работает Matlab, что является техническим вопросом. Вот почему появляется Stack Overflow. Если бы речь шла о более общей языковой функции, присутствующей во многих языках, она, вероятно, была бы больше связана с P.SE.   -  person Panzercrisis    schedule 04.06.2014
comment
@Panzercrisis Спасибо, теперь понятно.   -  person zuiqo    schedule 05.06.2014


Ответы (2)


В MATLAB строка — это просто вектор символов ASCII. Подробнее об 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
person Steve    schedule 04.06.2014
comment
Вы можете использовать функцию char для перехода от кода ascii к символу (или строке), например, когда char(49) становится '1'. Вы можете использовать abs для перехода от ascii к double, так как abs('1') становится 49. Введите строки справки для получения дополнительной информации. - person Joe Serrano; 05.06.2014

Комментатор попал прямо в голову: ASCII-код для «1» — 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 к двойному и дает вам результат.

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
person whatsisname    schedule 04.06.2014