我将在我自己测试的结果中添加一个答案,但如果人们用他们的知识做出贡献,我会很高兴,这只是我所做的一个简单测试。
我已经测试了以下条件,单元格大小为 1000 和 1000 循环(总时间的结果,我可能必须运行超过 1000 次,因为我对结果有一点波动,但无论如何,这不是一篇科学文章):
- 基本操作(总和)
- 简单的 for 循环:0.2663 秒
- 细胞乐趣:9.4612 秒
- 字符串操作 (strcmp)
- 简单的 for 循环:1.3124 秒
- 细胞乐趣:11.8099 秒
- 内置(空)
- 简单的 for 循环:8.9042 秒
- cellfun(字符串输入 ->参见此参考):0.0105 s
- cellfun(fcn 句柄输入 ->参见此参考):0.9209 s
- 非均匀(正则表达式)
- 简单的 for 循环:24.2157 秒
- cellfun(字符串输入):44.0424 秒
因此,似乎带有匿名函数调用的 cellfun 比简单的 for 循环慢,但如果您将使用内置的 matlab 方法,请使用 cellfun 并与字符串引号一起使用。这不一定适用于所有情况,但至少适用于测试的功能。
实现的测试代码(我远不是优化专家,所以这里是代码,以防我做错了):
function ...
[loop_timeAdd,cellfun_timeAdd,...
loop_timeStr,cellfun_timeStr,...
loop_timeBuiltIn,cellfun_timeBuiltInStrInput,...
cellfun_timeBuiltyInFcnHandle,...
loop_timeNonUniform,cellfun_timeNonUniform] ...
= test_cellfun(nTimes,nCells)
myCell = repmat({0},1,nCells);
output = zeros(1,nCells);
% Basic operation
tic;
for k=1:nTimes
for m=1:nCells
output(m) = myCell{m} + 1;
end
end
loop_timeAdd=toc;
tic;
for k=1:nTimes
output = cellfun(@(in) in+1,myCell);
end
cellfun_timeAdd=toc;
% String operation
myCell = repmat({'matchStr'},1,nCells); % Add str that matches
myCell(1:2:end) = {'dontMatchStr'}; % Add another str that doesnt match
output = zeros(1,nCells);
tic;
for k=1:nTimes
for m=1:nCells
output(m) = strcmp(myCell{m},'matchStr');
end
end
loop_timeStr=toc;
tic;
for k=1:nTimes
output = cellfun(@(in) strcmp(in,'matchStr'),myCell);
end
cellfun_timeStr=toc;
% Builtin function (isempty)
myCell = cell(1,nCells); % Empty
myCell(1:2:end) = {0}; % not empty
output = zeros(1,nCells);
tic;
for k=1:nTimes
for m=1:nCells
output(m) = isempty(myCell{m});
end
end
loop_timeBuiltIn=toc;
tic;
for k=1:nTimes
output = cellfun(@isempty,myCell);
end
cellfun_timeBuiltyInFcnHandle=toc;
tic;
for k=1:nTimes
output = cellfun('isempty',myCell);
end
cellfun_timeBuiltInStrInput=toc;
% Builtin function (isempty)
myCell = repmat({'John'},1,nCells);
myCell(1:2:end) = {'Doe'};
output = cell(1,nCells);
tic;
for k=1:nTimes
for m=1:nCells
output{m} = regexp(myCell{m},'John','match');
end
end
loop_timeNonUniform=toc;
tic;
for k=1:nTimes
output = cellfun(@(in) regexp(in,'John','match'),myCell,...
'UniformOutput',false);
end
cellfun_timeNonUniform=toc;