如何将MATLAB中的元音字母从大写改为小写或从小写改为大写?

3

我需要将字符串中的每个元音字母改为大写或小写,具体取决于它们当前的大小写情况。举例来说,"UPPERCASE lowercase"将变为"uPPeRCaSe lOwErcAsE"。

目前为止,我尝试了多种方法但都没有成功。

str=  'UPPERCASE lowercase';
vow = 'aeiou';
vowm = 'AEIOU';

for k = 1:5

if str(str == vow(k))
str(str == vow(k))= vowm(k);
else 
    if str(str == vowm(k))
        str(str == vowm(k))= vow(k);

预期输出:"大写 小写"

实际输出:"大写 小写"

我对Matlab非常陌生,有些迷茫。感谢您的帮助。

3个回答

5

使用ismember函数查找每个元音字母类型(大写或小写)的所有出现次数,并使用upperlower函数将它们转换为相应的大小写:

str = 'UPPERCASE lowercase';    %// original string
indl = ismember(str, 'aeiou');  %// locations of lowercase vowels
indu = ismember(str, 'AEIOU');  %// locations of uppercase vowels
str(indl) = upper(str(indl));   %// convert from lower to upper
str(indu) = lower(str(indu));   %// convert from upper to lower

3

如问题所列,我假设以下为输入 -

%// Inputs
str=  'UPPERCASE lowercase'
vow = 'aeiou'
vowm = 'AEIOU'

方法一

基于changem的一种方法,用于替换值 -

%// Create maps from input string to reflect changes from lower to upper
%// and vice versa
map1 = changem(str,vowm,vow)
map2 = changem(str,vow,vowm)

%// Find indices to be changed for lower to upper change and vice versa change
idx1 = find(map1~=str)
idx2 = find(map2~=str)

%// Selectively change input string based on the indices to be changed and maps
str(idx1) = map1(idx1)
str(idx2) = map2(idx2)

第二种方法

使用bsxfun函数 -

%// Find indices to be changed for lower to upper change and vice versa change
[~,idx1] = find(bsxfun(@eq,str,vow'))
[~,idx2] = find(bsxfun(@eq,str,vowm'))

%// Selectively change input string based on the indices to be changed and maps
str(idx1) = str(idx1)-32
str(idx2) = str(idx2)+32

使用+-32相比于第二种方法中的upperlower有什么优势?我知道这是一种不同的方法,但是upperlower似乎更直观。 - kkuilla
@kkuilla 当然不是那么直观,但我想要有些不同的东西,否则这两个答案,至少50%的内容会看起来一样 :) - Divakar

2
你可以使用正则表达式
但我不知道这与其他答案有多大的不同...
str=  'UPPERCASE lowercase';
vow = '[aeiou]';
vowm = '[AEIOU]';

indl = regexp(str,vow);
indu = regexp(str,vowm);

str(indl) = upper(str(indl));
str(indu) = lower(str(indu));

谢谢。我认为对于大型数据集来说,这可能会相当慢。 - kkuilla
你认为哪个部分会使它变慢? - Divakar
是的,regexp 以慢著称。虽然我从未亲自计时过。 - Luis Mendo
在这种情况下,可能还可以,因为正则表达式并不太复杂。 - kkuilla

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接