设 strCellArr 是一个 4000*1 的单元格数组。每个单元格都是一个字符串。
判断每个单元格是否都有长度为 100 的字符串的最快方法是什么。
换句话说,我想要一些和
做同样事情的东西a= true;
For (i =0; i =length(strCellArr); i++)
if length(strCellArr{i}) ~= 100
a = false;
end
end
相关问题:
我可以将数组转换为 4000*100 的字符数组
charArr = char(strCellArr);
但是,这会在没有 100 个字符的行中引入空格。所以如果第 34 行只有 30 个字符。然后
charArr(34)(50)
将返回一个空格。
如何检查每个字符是否只是某些字符,在我的例子中(A、T、C 或 G)。有没有不使用 for 循环的方法?
最佳答案
哦哦,我就是喜欢以“什么是最快的方法......”开头的问题
这里有一些替代方案和比较:
% 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 解释器,从而使这个raging 快速 :)
现在,你的问题的第二部分:
% 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'
的出现,但仅限于他们的缺席。意思是,只需寻找那些空间 :)
不用说,这些时间都几乎可以忽略不计,而且这都是精神上的自慰,而不是真正有用的。但是很有趣! :)
关于arrays - 比较matlab中的细胞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17075990/