让strCellArr成为4000*1的单元格数组.每个单元格都是一个字符串
什么是告诉每个单元格是否有长度为100的字符串的最快方法.
换句话说,我想要一些与之相同的东西
a= true;
For (i =0; i =length(strCellArr); i++)
if length(strCellArr{i}) ~= 100
a = false;
end
end
Run Code Online (Sandbox Code Playgroud)
一个相关的问题:
我可以将数组转换为4000*100的字符数组
charArr = char(strCellArr);
Run Code Online (Sandbox Code Playgroud)
但是,这将在不包含100个字符的行中引入空格.因此,如果第34行只有30个字符.然后
charArr(34)(50)
Run Code Online (Sandbox Code Playgroud)
将返回一个空格.
在我的情况下(如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
Run Code Online (Sandbox Code Playgroud)
结果:
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
Run Code Online (Sandbox Code Playgroud)
鲜为人知的事实:字符串输入cellfun引用直接构建到cellfun二进制文件中的函数,因此不需要评估匿名函数.换句话说,cellfun没有通过在每个迭代它的MATLAB解释做出了一通,使得这款熊熊快:)
现在,问题的第二部分:
% Engineero
tic
A = 'ATCG';
all(all(ismember(char(strCellArr), A)));
toc
% My solution
tic
C = char(strCellArr);
~any(C(:)==' ');
toc
Run Code Online (Sandbox Code Playgroud)
结果:
Elapsed time is 0.061168 seconds. % ismember
Elapsed time is 0.005098 seconds. % direct comparison to whitespace
Run Code Online (Sandbox Code Playgroud)
产生这种差异是因为它ismember是在MATLAB m代码中实现的,并且充满了用户友好性(错误检查,错误,警告等)的代码,精心设计的概括,循环结构以及许多其他全部性能的东西.罚款.
由于我们事先知道那只是空间将在其铸件被添加到阵列中char,我们并没有要明确检查的出现'A','C','T','G',但只为自己abscence.意思是,只需寻找那些空间:)
不用说,这些时间都几乎可以忽略不计,这比实际上真正有用的都更精神自慰.但它的乐趣!:)