arrays - 比较matlab中的细胞

标签 arrays matlab

设 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/

相关文章:

c# - 读取 CSV 文件并将值存储到数组中

linux - 如何使用 matlab 在 Linux 中运行/执行(例如 ./mycode)

arrays - 如何在MongoDB中批量迭代?

java - 使用一个类中的方法到另一个类中

javascript - 如何在 JavaScript 中合并和分布第一个数组到第二个数组?

matlab - 使用 "find"命令累加值 "without for loops"

MATLAB:保存类属性

PHP if in_array 用于多个值

c++ - MKL 库在 mex 文件和独立 C++ 中的行为不同

string - Matlab中有没有类似于java函数String.split(delimiter)的函数?