【问题标题】:MATLAB: Capitalize first letter in string arrayMATLAB:将字符串数组中的第一个字母大写
【发布时间】:2018-04-27 14:12:01
【问题描述】:

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

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

【问题讨论】:

  • @horchler。最新版本的 MATLAB 有什么变化吗?
  • @MadPhysicist:字符串自 2016b 以来就已经存在。不要与 char 数组混淆。
  • @horchler。现在正在阅读它。谢谢。我想我已经失去联系超过 2 年了。

标签: string matlab


【解决方案1】:

您可以使用常规切片来实现。为了得到一个字母的大写,我使用了upper函数

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

【讨论】:

  • 你确定花括号吗?
  • 另外,size(str, 2) -> numel(str)?
  • @Mad Physicist ,您可以使用numelsize(str,2),我认为差别不大或没有差别。关于大括号,我使用它可以使用双重订阅str{i}(1)。有区别,因为大括号返回单元格中的内容(字符串),而 "" 返回一个单元格及其内容,因此我无法提取同一行中的第一个字符
  • 感谢您的解释。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    下面的代码会做你想做的事:

    string(cellfun(@(x) [upper(x(1)) x(2:end)], str, 'UniformOutput', false))
    

    cellfun 将其后面的匿名函数应用于变量 str。

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

    string 将元胞数组转换回字符串数组。

    已编辑:按照 cmets 中的要求转换回字符串数组。

    但是,其他答案可能会产生更易于阅读的代码。

    【讨论】:

    • 这将产生一个元胞数组。但是,我需要一个字符串数组。
    • @Andi,您可以在元胞数组上调用string,使其成为字符串数组
    【解决方案4】:

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

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

    【讨论】:

      【解决方案5】:

      这篇文章中有两个有点迂腐的小人物:

      1. 正确的语法应该是:

         arrayfun(@capitalize, ["house", "stone", "summer"]);
        
      2. 鉴于所涉及函数(upper、extractBefore、extractAfter)的矢量化特性,arrayfun 是多余的,即一个简单的函数调用应该可以工作:

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

      请注意,这些备注已在 R2020b 版本中进行了测试,尽管它也可能代表早期版本。我自己没有测试过。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-26
        • 2022-01-09
        • 2015-07-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多