比较matlab中的单元格

use*_*2pi 2 arrays matlab

让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循环的情况下完成它?

Rod*_*uis 6

哦,我只是喜欢那些以"最快的方式......"开头的问题.

以下是一些替代方案和比较:

% 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.意思是,只需寻找那些空间:)

不用说,这些时间几乎可以忽略不计,这比实际上真正有用的都更精神自慰.但它的乐趣!:)

  • @DangKhoa:我同意.实际上在MATLAB中经常出现这种情况; 涂糖越多,性能损失就越大.我认为*差异来自于MATLAB解释器中的`@(x)`强制*评估*,而直接`@length`只允许'length`函数的*lookup*. (3认同)