哦,我只是喜欢以“最快的方法是什么……”开头的问题
这里有一些替代方案和比较:
% Initalize
map = 'CATG';
strCellArr = cellfun(@(x) map(randi(4,100,1)),cell(4000,1), 'UniformOutput', false);
% Your original method
tic
a = true;
for el = strCellArr
if length(el{1}) ~= 100
a = false;
break;
end
end
toc
% My solution
tic
a = all(cellfun('length', strCellArr) == 100);
toc
% Dang Khoa's method
tic
a = all( cellfun(@(x) length(x) == 100, strCellArr) );
toc
% Engineero's method
tic
a = all(cellfun(@length, strCellArr) == 100);
toc
结果:
Elapsed time is 0.001158 seconds. % loop
Elapsed time is 0.000455 seconds. % cellfun; string argument
Elapsed time is 0.031897 seconds. % cellfun; anonymous function
Elapsed time is 0.006994 seconds. % cellfun; function handle
鲜为人知的事实:字符串输入cellfun
指的是直接内置到cellfun
二进制文件中的函数,因此不需要评估匿名函数。换句话说,cellfun
不必在每次迭代时都通过 MATLAB 解释器,从而使这变得快速:)
现在,你问题的第二部分:
% Engineero
tic
A = 'ATCG';
all(all(ismember(char(strCellArr), A)));
toc
% My solution
tic
C = char(strCellArr);
~any(C(:)==' ');
toc
结果:
Elapsed time is 0.061168 seconds. % ismember
Elapsed time is 0.005098 seconds. % direct comparison to whitespace
之所以出现这种差异,是因为ismember
它是在 MATLAB m 代码中实现的,并且充斥着旨在使用户友好的代码(错误检查、错误、警告等)、复杂的概括、循环结构和许多其他东西,这些都是一种性能惩罚。
由于我们事先知道在将数组转换为时只会将空格添加到数组中char
,因此我们不必显式检查, , ,的出现'A'
,而只需检查它们的缺失。意思是,只需寻找那些空间:)'C'
'T'
'G'
不用说,这些时间几乎都可以忽略不计,这一切都是精神上的自慰,而不是真正有用。但它的乐趣!:)