String MATLAB:字符串数组中的首字母大写

String MATLAB:字符串数组中的首字母大写,string,matlab,String,Matlab,我应该如何访问字符串数组中每个成员的第一个字符?例如,我想大写每个单词的第一个字母 str = ["house", "stone", "summer"] 以下代码将执行您想要的操作: string(cellfun(@(x) [upper(x(1)) x(2:end)], str, 'UniformOutput', false)) cellfun将其后面的匿名函数应用于变量str 匿名函数只返回第一个元素的大写字母后跟字符串的其余部分的连接 string将单元格数组转换回字符串数组 已编辑:按

我应该如何访问字符串数组中每个成员的第一个字符?例如,我想大写每个单词的第一个字母

str = ["house", "stone", "summer"]

以下代码将执行您想要的操作:

string(cellfun(@(x) [upper(x(1)) x(2:end)], str, 'UniformOutput', false))
cellfun
将其后面的匿名函数应用于变量str

匿名函数只返回第一个元素的大写字母后跟字符串的其余部分的连接

string
将单元格数组转换回字符串数组

已编辑:按注释中的要求转换回字符串数组


但是,另一个答案可能会产生更易于阅读的代码。

您可以使用传统的切片来完成。为了得到字母的大写字母,我使用了
upper
函数

for i=1:size(str,2)
    str{i}(1)=upper(str{i}(1))
end

我认为最好的解决方案是使用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.

通过调整@matlabbit的答案,利用MATLAB的最新版本可以从
arrayfun
发出
string
数组这一事实,您可以编写

capitalize = @(s) upper(extractBefore(s, 2)) + extractAfter(s, 1)
arrayfun(capitalize, ["house", "stone", "summer"])

在这篇帖子上有两条略显迂腐的评论:

  • 正确的语法应该是:

     arrayfun(@capitalize, ["house", "stone", "summer"]);
    
  • 鉴于所涉及函数(upper、extractBefore、extractAfter)的矢量化性质,arrayfun是冗余的,即简单的函数调用应该可以:

     capitalize(["house", "stone", "summer"]);
    

  • 请注意,这些备注已在R2020b版本中进行了测试,尽管它可能也适用于早期版本。我还没有亲自测试过。

    @horchler。MATLAB的最新版本有什么变化吗?@MadPhysicast:从那时起字符串就一直存在。不要与字符数组混淆。@horchler。现在读起来。谢谢我想我已经失去联系超过2年了。你确定花括号吗?还有,
    size(str,2)
    ->
    numel(str)
    ?@Mad physician,你可以使用
    numel
    size(str,2)
    ,我认为两者没有什么区别。关于花括号,我使用它可以使用双订阅
    str{I}(1)
    。有一点不同,因为花括号返回单元格中的内容(字符串),而
    返回单元格及其内容,因此我无法提取同一行中的第一个字符感谢您的解释。这将导致单元格数组。但是,我需要一个字符串数组。@Andi,您可以调用单元格数组上的
    string
    ,使其成为字符串数组