2015-04-20 4 views
1

У меня возникли проблемы с преобразованием символьной переменной в число в Matlab. Каждая ячейка переменной char содержит одно из двух возможных слов. Мне нужно преобразовать word_one (например), чтобы представлять «1», а word_two - «2».Как преобразовать char в число в Matlab

Есть ли команда, которая позволит мне это сделать?

До сих пор я пытался:

%First I converted 'Word' from cell to char 

Word = char(Word); 
Word(Word == 'Word_one') = '1'; 
Word(Word == 'Word_two') = '2'; 

Однако, я получаю:

Error using == 
Matrix dimensions must agree. 

Когда я пытаюсь включить первую букву только (т.е. 'W'.), Это только изменяет первую букву в полном слове (т.е. 1ord_one).

Есть ли простой способ сделать это?

Спасибо за вашу помощь - любые советы очень ценятся!

+1

try strcmp() ... – willpower2727

+0

Вы пробовали str2num? –

+0

также смотрите на 'strcmpi()', если вы хотите распознать регистр, нечувствительный к регистру. – Hoki

ответ

0

Похоже, здесь есть несколько потенциальных проблем.

Использовать strcmp() (сравнение строк) вместо вашего текущего утверждения эквивалентности. Сравнение строк с использованием == сравнивает элемент за элементом и возвращает логический вектор (где здесь требуется одно логическое значение). Сравнение строк, strcmp(), сравнивает все строки и возвращает одно значение.

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

Попробуйте что-нибудь по строкам следующего фрагмента.

for i = 1:length(Word) 
    if strcmp(Word{i},'Word_one') 
     Word{i} = '1'; 
    elseif strcmp(Word{i},'Word_two') 
     Word{i} = '2'; 
    end 
end 
+0

До сих пор я пробовал команду strcmp, которая работала, Cheers :) – StatsCode

1

Использование ismember:

possibleWords = {'Word_one', 'Word_two'}; %// template: words corresponding to 1, 2, ... 
words = {'Word_two', 'Word_one', 'Word_two'}; %// data: words you need to convert 
[~, result] = ismember(words, possibleWords); 

В этом примере

result = 
    2  1  2 

Если вам нужно больше гибкости, вы можете указать значение, соответствующее каждому слову:

possibleWords = {'Word_one', 'Word_two'}; %// template: words corresponding to 1, 2, ... 
correspondingValues = [1.1, 2.2]; %// template: value corresponding to each word 
words = {'Word_two', 'Word_one', 'Word_two'}; %// data: words you need to convert 
[~, ind] = ismember(words, possibleWords); 
result = correspondingValues(ind); 

, который дает

result = 
    2.2000 1.1000 2.2000 
0

Существует несколько способов решения этой проблемы. Вот мой подход.

% define your words 
words = {'word_one','word_two','word_two','word_one','word_one'}; 
% define a function to get the indexes of the words of interest 
getindex = @(c, y) cellfun(@(x) strcmp(x,y), c); 
% replace 'word_one' with '1' 
words(getindex(words, 'word_one'))={'1'}; 
% replace 'word_two' with '2' 
words(getindex(words, 'word_two'))={'2'}; 


words = 

    '1' '2' '2' '1' '1' 
0

Вы можете использовать короткий п простой unique -

input_cellarr = {'Word_two','Word_one','Word_two','Word_two','Word_one','Word_one'} 

[~,~,out] = unique(input_cellarr) 

Sample пробег -

input_cellarr = 
    'Word_two' 'Word_one' 'Word_two' 'Word_two' 'Word_one' 'Word_one' 
out = 
    2 
    1 
    2 
    2 
    1 
    1 

Пояснение:unique работы здесь, потому что он будет производить ascending order отсортированный массив числовые массивы.Теперь, когда используется на клеточных массивах, это ascending order переводит на alphabetical order Сортировка. Таким образом, unique(input_cellarr) всегда будет {'Word_one' , 'Word_two'}, потому что one в алфавитном порядке выше, чем two. Поэтому индексы out всегда будут иметь первый уникальный идентификатор: 1 для 'Word_one', а второй идентификатор - 2 для 'Word_two'.

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