我有许多大型单元格阵列(每个大约10000x100个单元格),其中包含字符数组,有时这些数字是字符串,有时它们是“..”或“x”或类似的东西。 我想将这些单元格数组转换为数字矩阵(双数组),以便所有“数字字符串”都是数字(双精度数),所有其他条目都是零。
实施例: 我有:
C = {'-34635', '22', 'x', '..', '5'; '..' , 'x', '-343','1','..'};
我想:
C_new = [-34635, 22, 0, 0, 5; 0, 0, -343, 1, 0];
我可以使用str2num
或str2double
进行此操作,但速度非常慢。我已经阅读了有关使用sprintf
和sscanf
的示例,但我无法让它工作。
非常感谢有关如何实现快速的任何提示/建议。 谢谢:))
答案 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)可能会提供更快捷的方式here(CStr2String
)。但是如果您的单元格数组只包含数字,那么它可以工作:
reshape(sscanf(sprintf('%s*', C{:}), '%f*'),2,[])
3)您可以测试此mex
- 函数str2doubleq
(mex 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.