for loop that changes specific letters to numbers
Show older comments
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
Accepted Answer
More Answers (2)
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 Comments
Walter Roberson
on 2 Oct 2019
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
on 2 Oct 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
on 3 Oct 2019
+1 very neat solution
Walter Roberson
on 3 Oct 2019
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.
Adam Danz
on 3 Oct 2019
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 :)
Walter Roberson
on 3 Oct 2019
semi-vowel does sound like the correct term.
In practice, y probably acts like a vowel more than it acts like a consontant .
Adam Danz
on 3 Oct 2019
Glad I could chip in! :)
Jos (10584)
on 3 Oct 2019
Another option:
str = 'apple';
TF1 = any(lower(str) ~= 'aeiou'.')
6 Comments
Walter Roberson
on 3 Oct 2019
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.)
Adam Danz
on 3 Oct 2019
TF1 = any(lower('apple') ~= 'aeiou'.')
TF1 =
1×5 logical array
1 1 1 1 1
I think what you meant was,
TF = ~any(lower('apple') == 'aeiou'.')
Walter Roberson
on 3 Oct 2019
TF1 = all(lower(str) ~= 'aeiou'.')
Jos (10584)
on 4 Oct 2019
Thanks for the corrections :-)
Adam Danz
on 4 Oct 2019
+1
This implicit expansion solution is faster and neater than my ismember() solution.
Categories
Find more on Entering Commands in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!