我应该如何访问,比如说,字符串数组的每个成员的第一个字符?例如,我想将每个单词的第一个字母大写。
str = ["house", "stone", "summer"]
答案 0 :(得分:5)
您可以使用传统切片来完成。为了获得一封信的大写,我使用了upper
函数
for i=1:size(str,2)
str{i}(1)=upper(str{i}(1))
end
答案 1 :(得分:3)
我认为最好的解决方案是使用extractBefore和extractAfter:
upper(extractBefore(str,2)) + extractAfter(str,1);
以下是性能基准:
function profFunc
str = ["house", "stone", "summer"];
n = 1E5;
% My solution
tic;
for i = 1:n
str = upper(extractBefore(str,2)) + extractAfter(str,1);
end
toc;
% Mikhail Genkin's solution
tic;
for i = 1:n
for i=1:size(str,2)
str{i}(1)=upper(str{i}(1));
end
end
toc;
% EdR's Solution
tic;
for i = 1:n
str = string(cellfun(@(x) [upper(x(1)) x(2:end)], str, 'UniformOutput', false));
end
toc
end
>> profFunc
Elapsed time is 0.121556 seconds.
Elapsed time is 1.034617 seconds.
Elapsed time is 10.319375 seconds.
答案 2 :(得分:1)
以下代码将执行您想要的操作:
string(cellfun(@(x) [upper(x(1)) x(2:end)], str, 'UniformOutput', false))
cellfun
将跟随它的匿名函数应用于变量str。
匿名函数只返回第一个元素大写的连接,后跟字符串的其余部分。
string
将单元格数组转换回字符串数组。
已编辑:可根据评论中的要求转换回字符串数组。
然而,另一个答案可能会产生更容易阅读的代码。
答案 3 :(得分:0)
调整@matlabbit的答案,以利用最近版本的MATLAB可以从string
发出arrayfun
数组的事实,你可以写
capitalize = @(s) upper(extractBefore(s, 2)) + extractAfter(s, 1)
arrayfun(capitalize, ["house", "stone", "summer"])
答案 4 :(得分:0)
关于这篇文章的两个有点迂腐的评论:
正确的语法是:
arrayfun(@capitalize, ["house", "stone", "summer"]);
鉴于所涉及函数(upper、extractBefore、extractAfter)的矢量化性质,arrayfun 是多余的,即一个简单的函数调用应该可以工作:
capitalize(["house", "stone", "summer"]);
请注意,这些备注已经在 R2020b 版本中进行了测试,尽管它也可能代表较早的版本。我自己没有测试过。