我在Matlab中有一个单元格数组:
strings = {'one', 'two', 'three'};
如何有效地计算所有三个字符串的长度?现在我使用for循环:
lengths = zeros(3,1);
for i = 1:3
lengths(i) = length(strings{i});
end
但是当你有大量的字符串(我有480,863个字符串)时,这是无法使用的。有什么建议吗?
答案 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)时间访问字符串长度。由于您在生成或加载字符串的同时更新它,因此它不应减慢速度,因为整数数组操作(通常)比字符串操作更快。