2015-02-05 7 views
1

Я делаю некоторую классификацию и для этой цели необходимо преобразовать целочисленный код в строки. Я написал что-то вроде этого:Сравнение строк и целых чисел в matlab

s(1).class = 1; 
s(2).class = 7; 
s(3).class = 9; 

[s([find([s.class] == 1)]).class] = deal('c1'); %first conversion 
[s([find([s.class] > 1)]).class] = deal('c2'); %second conversion 

и с удивлением обнаружил, s будет массивом 1x4 структуры после второго преобразования вместо ожидаемого массива 1x3 структуры со значениями. Теперь, после некоторых исследований, я понимаю, что после первого преобразования значение s(1).class равно 'c1', а аргумент find во втором преобразовании - это не то, что я предполагал. Оператор [s.class] фактически возвращает что-то вроде строки 'c1\a\t' с escape-последовательностями ASCII для колокольчика и горизонтальной вкладки.

В сравнении работает (возвращая матрицу [1 1 1 1] и тем самым расширяя свою структуру) Я предполагаю, что MATLAB преобразует либо операнд [s.class] или операнд 1. Что это? Что на самом деле сравнивается здесь номерами или символами?

А с другой стороны есть встроенный способ сделать > более ограничительным, i. е. требовать, чтобы операнды были одного типа, и если бы не ошибка?

+0

Возможно, это будет проще, если вы объясните, чего вы хотите достичь. Еще лучше, после ввода ввода и желаемого вывода –

+0

Это не столько желание чего-то добиться. Мне просто интересно, что происходит, когда я говорю matlab ''a'> 1', как я спрашиваю, над каким операндом преобразуется. Если это необходимо для достижения чего-то, то второй вопрос является релевантным: я хотел бы изменить поведение '>' так, чтобы '' a '> 1' дал мне некоторый вывод, например: недопустимое сравнение между char и int , –

+0

О, я понимаю сейчас –

ответ

2

Когда вы делаете сравнение 'ab' > 1, то char массив 'ab' конвертируется в double массива, а именно ASCII кодов символов. Таким образом, 'ab' > 1 эквивалентен double('ab') > 1, что дает [1 1].

Чтобы получить поведение, которое вы хотите (выдавать ошибку, если один из аргументов char) можно определить функцию:

function z = greaterthan(x,y) 
if ischar(x) || ischar(y) 
    error('Invalid comparison: one of the input arguments is of type char') 
else 
    z = x>y; 
end 

так что

>> greaterthan([0 1 2], 1) 
ans = 
    0  0  1 

>> greaterthan('ab', 1) 
??? Error using ==> greaterthan at 3 
Invalid comparison between char and int 
+0

Почему бы просто не использовать 'ischar' - или' isnumeric' для проверки числовых значений? – horchler

+0

Благодарим вас за ответ. Возможно, вы знаете, где я могу найти специфику, я не нашел их в документах. –

+0

@horchler True. Исправленный. Благодаря! –

0

Поскольку вы еще не представили ожидаемых результатов, я собираюсь с наблюдениями.

Вы используете метод понимания (путем вызова find), чтобы определить, какие места вы будете заселять для структуры s с результатами вашего метода deal (принимает аргумент c1 и c2). Вы уже установили свой тип для s {whatever) .class в первом фрагменте, который вы предоставили. Это означает, что это число, которое вы сравниваете, а не характер.

Это функция isa, чтобы посмотреть, к какому классу принадлежит ваша переменная. Используйте это, чтобы увидеть, что именно вы на самом деле вставляете (скажем, int32 для вашего дела).

+0

Я понимаю свой вывод. Да перед первым населением все значения '' 'являются числами. После первой совокупности значение в 's (1)' равно '' c1'', которое представляет собой строку символов и, как я пишу выше результат '[s.class]' после того, как первая популяция равна '' c1 \ а \ t''. Я знаю это.Вопрос не в том, какие типы у меня есть вопрос, что такое matlab _does_ с этими типами. Извините, если это не ясно из моего вопроса. –

Смежные вопросы