2016-09-21 2 views
0

文字配列を含む大規模なセル配列(それぞれ約10000x100セル)があります。これらは文字列であり、somtimesは '..'や '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 -function str2doubleqmex str2doubleq.cpp)をテストすることができます。 @SenorPenguinはこの機能をテストし、より速いことを発見しました。しかし、この機能にはバグがあります(@SenorPenguinに対するコメントのコメントを参照)。

4)MATLAB 2016bをお持ちの場合、@ SenorPenguinの答えをテストできます。残念ながら、double(string(C))はMATLAB 2016aでは動作しません。

ベンチマーク(1000倍の繰り返し):cellstrsで

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

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

ありがとうございます。私は私の答えがうまくいった。 –

関連する問題