如何在Matlab中用字符串转换大型混合单元阵列以快速双矩阵?

时间:2016-09-21 13:07:52

标签: matlab printf cell-array

我有许多大型单元格阵列(每个大约10000x100个单元格),其中包含字符数组,有时这些数字是字符串,有时它们是“..”或“x”或类似的东西。 我想将这些单元格数组转换为数字矩阵(双数组),以便所有“数字字符串”都是数字(双精度数),所有其他条目都是零。

实施例: 我有:

C = {'-34635', '22', 'x', '..', '5'; '..' , 'x', '-343','1','..'}; 

我想:

C_new =  [-34635, 22, 0, 0, 5; 0, 0, -343, 1, 0];

我可以使用str2numstr2double进行此操作,但速度非常慢。我已经阅读了有关使用sprintfsscanf的示例,但我无法让它工作。

非常感谢有关如何实现快速的任何提示/建议。 谢谢:))

2 个答案:

答案 0 :(得分:2)

1)使用str2double

C_new = str2double(cellstr(C));
C_new(isnan(C_new)) = 0;

C_new =

  -34635          22           0           0           5
       0           0        -343           1           0

2)可能会提供更快捷的方式hereCStr2String)。但是如果您的单元格数组只包含数字,那么它可以工作:

 reshape(sscanf(sprintf('%s*', C{:}), '%f*'),2,[])

3)您可以测试此mex - 函数str2doubleqmex str2doubleq.cpp)。 @SenorPenguin测试了这个功能,发现它更快。但是这个函数有一个错误(请参阅@SenorPenguin回复的评论)。

4)如果你有MATLAB 2016b,你可以测试@ SenorPenguin的答案。不幸的是,double(string(C))在我的MATLAB 2016a中不起作用。

基准(1000次重复):

str2double(cellstr(C))     Elapsed time is 1.611320 seconds.
str2double(C)              Elapsed time is 1.612186 seconds.
str2doubleq(C)             Elapsed time is 0.027442 seconds.

答案 1 :(得分:2)

使用cellstrs:

C_new = str2double(C);
C_new(C_new == nan) = 0;

16b中出现了一个新的字符串数据类型:

S_new = double(string(C));
S_new(S_new == nan) = 0;

效果比较:

>> C = {'-34635', '22', 'x', '..', '5'; '..' , 'x', '-343','1','..'};
>> C = repmat(C,5000,20);

>> tic; str2double(C); toc
Elapsed time is 83.301997 seconds.

>> tic; double(string(C)); toc
Elapsed time is 0.985841 seconds.