for loop that changes specific letters to numbers

I want to replace the vowels AEIOU with the number 0 and all other letters with the number 1. For example the output should be ans = [0 1 1 1 0] if the user inputs apple. I know I must be misunderstanding how to get the loop to go through my whole string. This is what I have managed so far.
party = input('What is your answer? ', 's');
n = length(party)
for i = 1:n
if i == 'A'
disp(0)
elseif i == 'B'
disp(1)
elseif i == 'C'
disp(1)
end
end

 Respuesta aceptada

party = input('What is your answer? ', 's');
n = length(party)
for i = 1:n
if party(i) == 'A'
party(i) = 0;
elseif i == 'B'
party(i) = 1;
elseif i == 'C'
party(i) = 1;
end
end
disp( double(party) )

7 comentarios

The conditions following the initial one all contain the index value i in the antecedent.
Instead, it should be
for i = 1:n
if party(i) == 'A'
party(i) = 0;
elseif party(i) == 'B'
party(i) = 1;
elseif party(i) == 'C'
party(i) = 1;
end
end
Is the idea to create a conditional statement for each individual character in both upper and lower case, presumably? That would result in over 100 conditions. An improvement would be to use lower() or upper() which would eliminate 26 of those conditions. Why not just use the non-loop, 1-liner?
~isstrprop(party, 'vowel')
It would be nice if 'vowel' were a category option.
party = 'apple';
~isstrprop(party, 'vowel')
Error using isstrprop
vowel is an invalid qualifier.
r2019b
Atch, I was getting questions confused, as someone recently asked about upper vs lower case.
Seaturtle
Seaturtle el 3 de Oct. de 2019
I ended up making the changes myself with the original answer that you posted, so it worked out great. Thank you!
Guillaume
Guillaume el 3 de Oct. de 2019
It would be nice if 'vowel' were a category option.
The problem with that is what is a vowel or not depends on the language. Some letters such as 'y' in english can also qualify as a vowel or consonant depending on the word.
Adam Danz
Adam Danz el 3 de Oct. de 2019
True. It would be neat to play around with one of the vowel classification algorithms that are not specific to any language such as this one (link below) that is based on character co-occurrences. It wouldn't necessarily solve the fuzzy set problem but it would be a semi-objective, language-independent classification.

Iniciar sesión para comentar.

Más respuestas (2)

Adam Danz
Adam Danz el 2 de Oct. de 2019
Editada: Adam Danz el 2 de Oct. de 2019
No loop needed.
str = 'apple';
isConsonant = ~ismember(lower(str),'aeiou') %lower() makes it not case sensitive
If you really wanted to do that in a loop,
n = numel(party);
isConsonant = true(1,n);
for i = 1:n
if ismember(party(i),'aeiou')
isConsonant(i) = false;
end
end
In both cases, isConsonant is a logical vector. If you want a double vector of 0/1 instead of false/true,
isConsonant = double(isConsonant);

8 comentarios

The test is not for consonants: the test is for non-vowels. For example a space or period should have 1 in that location, not 0
disp() of one digit at a time does not satisfy ans = [0 1 1 1 0]
Adam Danz
Adam Danz el 2 de Oct. de 2019
The no-loop version does exactly that though the variable name is misleading. The question specifies the encoding of "letters" as opposed to any character and since all non-vowel letters are consonants, the variable name would be OK if the only input were letters.
But my for-loop method indeed had issues that were fixed.
Stephen23
Stephen23 el 3 de Oct. de 2019
+1 very neat solution
In English, y can act like a vowel (and often does). w as well, but that is rare. There is a third letter as well like this but I keep forgetting which one.
J, maybe?
This solution below categorizes j, w, and y as a vowel based on a binomial random draw with a probability of being a vowel at 50% although that probability should be lowered to reflect the true frequency of those letters representing vowels :D
str = 'jabberwocky';
vowels = 'aeiou';
semiVowels = 'jwy';
isConsonant = double(~ismember(lower(str),vowels))
isSemiVowel = ismember(str,semiVowels);
isConsonant(isSemiVowel) = binornd(1, .5, [1, sum(isSemiVowel)]); %Just for fun :)
semi-vowel does sound like the correct term.
In practice, y probably acts like a vowel more than it acts like a consontant .
Seaturtle
Seaturtle el 3 de Oct. de 2019
Editada: Seaturtle el 3 de Oct. de 2019
Thanks for this answer! This really helped with my understanding of not using a loop to do something with shorter code.
Adam Danz
Adam Danz el 3 de Oct. de 2019
Glad I could chip in! :)

Iniciar sesión para comentar.

Jos (10584)
Jos (10584) el 3 de Oct. de 2019
Another option:
str = 'apple';
TF1 = any(lower(str) ~= 'aeiou'.')

6 comentarios

Cute.
(Needs R2016b or newer.)
(I wonder if I can stop saying that now that R2019b is out? I think there are still a fair number of people on older releases though.)
TF1 = any(lower('apple') ~= 'aeiou'.')
TF1 =
1×5 logical array
1 1 1 1 1
Adam Danz
Adam Danz el 3 de Oct. de 2019
Editada: Adam Danz el 3 de Oct. de 2019
I think what you meant was,
TF = ~any(lower('apple') == 'aeiou'.')
TF1 = all(lower(str) ~= 'aeiou'.')
Jos (10584)
Jos (10584) el 4 de Oct. de 2019
Thanks for the corrections :-)
Adam Danz
Adam Danz el 4 de Oct. de 2019
+1
This implicit expansion solution is faster and neater than my ismember() solution.

Iniciar sesión para comentar.

Categorías

Más información sobre Entering Commands en Centro de ayuda y File Exchange.

Etiquetas

Preguntada:

el 2 de Oct. de 2019

Comentada:

el 4 de Oct. de 2019

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by