2016-09-21 2 views
0

以下は、私の問題を説明するサンプルコードです。は、長いセルの文字データを数値行列に素早く変換する方法ですか?

ff= [{'1 2 3 4 5'};{'2 2 3 4 2'};{'3 2 3 4 3'};{'4 2 3 4 4'}]; 
YY=[]; 
for i=1:length(ff) 
    xx=str2num(ff{i,1}); 
    YY=[YY;xx]; 
end 

サンプルコードに似ていますが、私の実際の長さは非常に長く、変換を完了するのに時間がかかります。それをより速くする方法はありますか?

答えて

2

あなたのソリューションは、毎回forループを通してYYのサイズを拡大し続けるので、特に遅くなります。

これを最適化するには、最初にstrjoinを使用して文字列のセル配列を1つの長い文字列に変換します。その後、すぐにこの文字列全体にstr2numを適用し、結果を再形成することができます。

YY = reshape(str2num(strjoin(ff)), [], numel(ff)).' 

% 1 2 3 4 5 
% 2 2 3 4 2 
% 3 2 3 4 3 
% 4 2 3 4 4 

MATLABのバージョンがstrjoinを持っていない場合、あなたは常にsprintf

YY = reshape(str2num(sprintf('%s ', ff{:})), [], numel(ff)).'; 

でそれを置き換えることができます別のオプションは、cellfunnum2strを使用して数値にセル配列の各エントリに変換することですその結果を最初の次元に沿って連結します。

values = cellfun(@num2str, ff, 'UniformOutput', false); 
YY = cat(1, values{:}); 

最初のオプションでは、一度だけnum2strを呼び出し、strjoinによって作成された一時的な文字列を格納するのに必要なメモリが数値と同じデータを格納するために必要なスペース未満であることを行っているので、約2倍高速でありますデータ型(double)。

関連する問題