2013-02-22 24 views
5

私はMatlabを使ってC++でいくつかの外部呼び出しを呼び出し、巨大な計算行列を受け取っています。行列は非常に大きく、このC++プログラムのソースコードにアクセスすることはできません。 (もしあれば、私はすぐにC++からセーブします)Matlab行列を保存する最も速い方法

今の私のシステムでは、このC++プログラムは1秒間しか与えられたデータを計算せずにMatlabに返すだけです。そして、Matlabのdlmwriteは、この単一の巨大アレイをディスクに保存するのに300秒。私は計算するために何千人も持っている、と私は時間を削減したい。

だから、Matlabに保存する最も速い方法は何ですか?

+0

保存したデータはどうしますか?それらをExcelで読みますか? MATLABでのみ使用しますか? –

+0

この処理されたデータは、他のいくつかのプログラムによってさらに使用されます。 – Karl

+0

これはあまり役に立ちません。他のプログラムをどのような入力形式で受け入れることができますか? –

答えて

5

可能な限り速い方法はおそらくMatlabのsaveコマンドです。代わりに、fwrite行列全体をバイナリファイルにすることもできます。

使用するdlmwriteは値をテキストに変換します。これは時間がかかり、ディスクに書き込むデータが多くなります。あなたが本当にそのフォーマットでデータを持っている必要がない限り、それをしないでください。 dlmwriteは、ファイルをインクリメンタルに書き込むループではなく、大きな行列で1回呼び出す方が速いことに注意してください。

+0

'a = zero(10000);をテストしました。 dlmwrite(...)は89.5秒かかりますが、save(...)は2.68秒です。 'これは印象的です。 – Karl

+0

残念ながら、私がsave関数からmatファイルを使用しようとすると、私はmatファイルを読み込む必要があります。 – Karl

+0

@Karlあなたのデータによっては、.matファイルを読むのが複雑になることがあります。 'fwrite'はおそらく' save'と同じくらい速いですが、独自のカスタムバイナリフォーマットを決めてそれを読み書きできるようにしなければなりません。 – shoelzer

2

Matlab専用のソリューションが必要な場合は、おそらくASCIIのバイナリまたはfprintfにfwriteを使用します。しかし、私はMatlabとJavaを混在させたいのですが、これは通常は高速ですからです。私は何かのようにする

Java Code 
package mypackage.release; 

import java.io.DataOutputStream; 
import java.io.BufferedOutputStream; 
import java.io.FileOutputStream; 
import java.io.IOException 


public class MatrixWriter { 
    public static void write(String fileName, double[] matrix) throws IOException { 
    DataOutputStream dos = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(fileName))); 
    for (double d : matrix) 
     dos.writeDouble(d); 
    dos.close(); 
    } 
} 

Matlab Code 
import mypackage.release.MatrixWriter; 
M = get matrix from c++; 
MatrixWriter.write('myfile.dat', M(:)); 

これは私の頭の上の何かですが、私はこれのすべての時間を使用します。それが役に立てば幸い。

+0

コードVS dlmwriteの結果を表示してください。 – Karl

+1

m = 0(1000); tic; dlmwrite( 'temp.dat'、m); toc; 経過時間は2.296942秒です tic; MatrixWriter.write( 'temp.dat'、m(:)); toc 経過時間が0.252032秒 – PaxRomana99

+0

fyiで、これをfwriteと比較するだけです。この場合は速くなります。もっと複雑なことをやっているのでなければ、それは最善の方法かもしれません。 – PaxRomana99

関連する問題