2012-10-17 13 views
10

私はテキストファイルに書き込まなければならない大きな行列(2e6 x 3)を持っています。Octaveでテキストファイルに行列を書き込む最も速い方法は何ですか?

このタスクを達成するためにdlmwriteは約230秒かかる。

あなたの経験から、大きなマトリックスをテキストファイルに書き込む最も速い方法は何ですか?

+1

てみました保存する。つまり、 'save -ascii output.txt variableName' – petrichor

+0

データを保存するだけでいいですか、それともテキストファイルでフォーマットする必要がありますか? @ petrichorのアイデアはうまくいくはずです。 – twerdster

答えて

13

次はMATLABに適用されますが、Octaveで試してみることをお勧めします。まず第一に、もしあなたができるなら - 行列を転置します。ここでは転置されていない場合、それは確かに年齢を取る

A = rand(3, 1e6); 
tic; 
fid = fopen('data.txt', 'w+'); 
for i=1:size(A, 1) 
    fprintf(fid, '%f ', A(i,:)); 
    fprintf(fid, '\n'); 
end 
fclose(fid); 
toc 

tic; 
csvwrite('data.txt', A); 
toc; 

Elapsed time is 1.311512 seconds. 
Elapsed time is 2.487737 seconds. 

(本質的dlmwritefprintfcsvwriteを用いた例です。 By default, fprintf flushes the buffer after every call。ファイルを開くにはwの代わりにWを使用することができますが、ここではあまり状況を改善しません。

+0

参考書Octaveでcsvwriteを試しましたが、正常に動作します。 –

+2

明示的なループを避け、 'fprintf(fid、 '%f%f%f \ n'、A)'を使用することもできます。また、fprintfは変数に適用されたフォーマットを列方向にリサイクルします。例: 'tic; fid = fopen( 'data.txt'、 'w +'); fprintf(fid、 'a =%f b =%f c =%f \ n'、A); fclose(fid); toc' 経過時間は2.019833秒です。 1e6行のそれぞれに3つの数字と改行を与えます。 –

0

理論的には、@angainorが言うによると、1にもパフォーマンスを向上させることができ 無用バッファのフラッシュを避けるために、ラッピングチャンクで何とか

for i=1:size(A, 1) 
    fprintf(fid, '%f ', A(i,:)); 
    fprintf(fid, '\n'); 
end 

を、

1. coverting (in memory) numbers->string + introduction of termination characters '\n' 
    (for say K matrix rows) 
2. writing of the obtained string to file through fscanf. 

を試みるべきiedoing ..

7

これを試しましたか?私はそれがdlmwriteと比較してスピードであるかどうかはわかりません。

save out.txt data 

ヘッダは、単に基本的なUNIXコマンドを使用して除去することができるtail例えば:

a = [1 2;3 4]; 
save temp.txt a; 
+2

おそらく、この方法で使用する必要があります。 temp.txtを保存する-ASCII; toc; – Kupto

1

あなたは(ヘッダを含む)スペース区切りでtext形式で保存することができdata変数を有します(すべてのLinux/MacのOS上):

tail -n +6 out.txt > file.csv 
0
MATLABで

使用これを:オクターブで

save -ascii output.txt variableName 

使用この:あなたは `の` -ascii`オプションを

save hello1.m variableName -ascii 
関連する問題