如何有效地计算字符串单元格数组的字符串长度

时间:2012-01-16 14:56:11

标签: string matlab

我在Matlab中有一个单元格数组:

strings = {'one', 'two', 'three'};

如何有效地计算所有三个字符串的长度?现在我使用for循环:

lengths = zeros(3,1);
for i = 1:3
    lengths(i) = length(strings{i});
end

但是当你有大量的字符串(我有480,863个字符串)时,这是无法使用的。有什么建议吗?

2 个答案:

答案 0 :(得分:9)

您也可以使用:

cellfun(@length, strings)

它不会更快,但会使代码更清晰 关于缓慢,您应首先运行探查器以检查瓶颈在哪里。只有这样才能优化。

编辑:我刚刚回忆起'length'曾经是旧版Matlab版本中cellfun的内置函数。所以它可能实际上更快!尝试

 cellfun('length',strings)

编辑(2):我必须承认我的第一个答案是疯狂猜测。在@Rodin的评论之后,我决定查看加速。

以下是基准的代码:

首先,生成大量字符串并保存到磁盘的代码:

function GenerateCellStrings()
    strs = cell(1,10000);
    for i=1:10000
        strs{i} = GenerateRandomString();
    end
    save strs;
end

function st = GenerateRandomString()
    MAX_STR_LENGTH = 1000;
    n = randi(MAX_STR_LENGTH);
    st = char(randi([97 122], 1,n ));

end

然后,基准本身:

 function CheckRunTime()
    load strs;
    tic;
    disp('Loop:');
    for i=1:numel(strs)
        n = length(strs{i});
    end
    toc;

    disp('cellfun (String):');
    tic;
    cellfun('length',strs);
    toc;

    disp('cellfun (function handle):');
    tic;
    cellfun(@length,strs);
    toc;

end

结果是:

  

循环:
  经过的时间 0.010663 秒   cellfun(String):
  经过的时间 0.000313 秒   cellfun(功能句柄):
  经过的时间 0.006280 秒。

哇!! 'length'语法比循环快约30倍!我只能猜到它变得如此之快。也许它特意识别length这一事实。可能是JIT优化。

编辑(3) - 我发现了the reason加速。这确实是对length的认可。感谢@reve_etrange的信息。

答案 1 :(得分:2)

保留所述字符串长度的数组,并在更新字符串时更新该数组。这将允许您O(1)时间访问字符串长度。由于您在生成或加载字符串的同时更新它,因此它不应减慢速度,因为整数数组操作(通常)比字符串操作更快。