StatsCode
StatsCode

Reputation: 39

How to convert char to number in Matlab

I am having trouble converting a character variable to a number in Matlab. Each cell in the char variable contains one of two possible words. I need to convert word_one (for example) to represent '1', and word_two to represent '2'.

Is there a command that will let me do this?

So far I've tried:

%First I converted 'Word' from cell to char

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

However, I get the:

Error using  == 
Matrix dimensions must agree.

When I try to include the first letter only (ie. 'W'), it only changes the first letter in the full word (ie. 1ord_one).

Is there an easy way to do this?

Thanks for your help - any advice is much appreciated!

Upvotes: 1

Views: 590

Answers (4)

Divakar
Divakar

Reputation: 221574

You can use short n simple unique -

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

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

Sample run -

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

Explanation: unique works here because it will produce an ascending order sorted array with numeric arrays. Now, when used on cell arrays, that ascending order translates to alphabetical order sorting. Thus, unique(input_cellarr) would always have {'Word_one' , 'Word_two'} because one is alphabetically higher up than two. Therefore the out indices would always have the first unique ID as 1 for 'Word_one' and the second ID as 2 for 'Word_two'.

Upvotes: 0

siliconwafer
siliconwafer

Reputation: 732

There are a number of ways to solve this problem. Here's my approach.

% 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'

Upvotes: 0

Ryan J. Smith
Ryan J. Smith

Reputation: 1140

Looks like there are a couple of potential issues here.

Use strcmp() (string compare) in place of your current equivalence statement. Comparing strings using == compares element by element and returns a logical vector (where here you want a single logical value). String comparison, strcmp(), will compare the entire strings instead and return a single value.

It's also probably not necessary for you to convert your cell array. You can maintain the cell array structure and address each cell individually.

Try something along the lines of the following snippet.

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

Upvotes: 0

Luis Mendo
Luis Mendo

Reputation: 112689

Use 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);

In this example,

result =
     2     1     2

If you need more flexibility, you can specify the value corresponding to each word:

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);

which gives

result =
    2.2000    1.1000    2.2000

Upvotes: 1

Related Questions