2016-09-21 23 views
0

我有許多包含字符數組的大單元陣列(每個大約10000x100單元格),有時這些數字是字符串,有時候它們是'..'或'x'或類似的東西。 我想將這些單元格數組轉換爲數字矩陣(雙數組),以便所有「數字串」都是數字(雙精度)和所有其他的條目零。如何用字符串來隱藏大型混合單元陣列以在Matlab中快速加倍矩陣?

例子: 我:

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

我想:

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

我可以str2numstr2double做到這一點,但它是可怕的慢。我已閱讀使用sprintfsscanf的示例,但我無法使其工作。

任何有關如何實現這個快速非常讚賞的提示/建議。 謝謝:)

回答

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. 
+0

謝謝,我已經嘗試過,它的工作,這是真的,但它是非常緩慢。我正在尋找更快的方法。 –

+0

關於'sscanf'你看到這個鏈接https://fr.mathworks.com/matlabcentral/answers/18509-cell-conversion-to-double –

+0

我的想法是使用sprintf和sscanf完全從你發佈的第一個鏈接。但是由於您提到的原因,我無法使用它處理我的數據,即我的數據不僅包含數字。這就是我的問題。我怎樣才能解決一個單元格不僅數字。感謝您的幫助 –

2

隨着cellstrs:

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

性能比較:

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

一個新的字符串數據類型在16B出來

>> 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. 
+0

好答案(+1)。你會檢查['str2doubleq']的速度(http://fr.mathworks.com/matlabcentral/fileexchange/28893-fast-string-to-double-conversion)嗎?在我的計算機'str2double(cellstr(C))'有時快一些,有時比'str2double(C)'慢。 –

+1

'>> tic; str2doubleq(C); TOC; 已用時間爲0.248111秒。# 由於一些評論提到,str2doubleq有一些錯誤。 '>> str2doubleq('1,000.25')' 'ans = 0.2500 + 0.0000i' – matlabbit

+0

謝謝。我已經提出了我的答案。 –