3

LinuxクラスターのCプログラムで長いdoublefloatデータを生成しています。クラスターにインストールされていないMatlabにデータをエクスポートする必要があります。

最善の方法は何ですか?私のアドバイザーは、printfステートメントを使用してエクスポートするように言っています。彼はデータをコンマ区切りのファイル(およびfprintf)に送信することを意味していると思います。しかし、それは遅く、メモリを使いすぎて、精度が大幅に低下する可能性があるように思われます。

.MATファイルの読み取りと書き込み用にこのWebページを見つけましたが、クラスターにコピーしたページやをよく理解していませんが、コンパイルできません(明らかに、 MATLAB。

Linux/CからWindows/MATLABにデータをエクスポートするための最良の、または最も簡単な、または最速の方法は何ですか?その方法を開始するにはどうすればよいですか?私はCにかなり慣れていないので、ライブラリを取得、インストール、構成、およびリンクする方法を理解するための支援が必要になる可能性があると答えたときにアドバイスを受けてください。しかし、それが終わったら、私はそれらの使い方を学ぶのがかなり上手だと思います。

4

3 に答える 3

2

なぜあなたはあなたが精度を失うと思いますか?CSVの唯一の欠点は、ASCIIファイルがバイナリファイルよりもはるかに多くのストレージを必要とすることですが、優れたヘアカットの価格でテラバイトのストレージを利用できる今日では、それはほとんど問題になりません。

ギガバイトをギガバイトに書き込む場合にのみ著しく遅くなりますが、通常、計算には非常に長い時間がかかるため、ASCIIとバイナリの違いは完全に無視できます(計算にそれほど時間がかからない場合:なぜクラスターが必要なのですか?それから?)

いずれにせよ、私はASCIIを選びます-バイナリブロブの書き込みと読み取りの方法は2か所に文書化する必要があります。書き込み側と読み取り側の両方でバグを作成する方が簡単です。人間はファイルなどを読み取ることができます。また、MATファイルの形式は次のMatlabリリースで変更される可能性があります(過去と同様)。

ASCIIを使用すると、これらの問題は発生しません。私が考えることができる唯一の欠点は、Matlabで小さなクラスター固有のファイルリーダーを作成する必要があることです(これは、すべてのバグを解決してMATを維持するよりもはるかに少ない作業です。ファイルライター)。

とにかく、ASCII用のMatlabで利用できるツールはたくさんあります:、、、、textreadいくつか例を挙げます。C側では、実際に使用するだけです(ドキュメントはこちら)。dlmreadimportdatafprintf

于 2012-11-01T07:09:11.273 に答える
1

私もかつてこの問題を抱えていて(まあ、ある種...)、単純なバイナリ形式を使用して作業を行いました。

データ形式が静的である場合、つまりデータ形式が変更されない場合は、必要なものに正確に制限し、ロードプログラムに正確な形式をハードコーディングできます。ただし、列の追加と削除に柔軟に対応したい場合は、データ形式に関する情報を追加し、読み取り時にそれを評価するための一種のヘッダーを定義する必要があります。

データを簡単にインポートするための秘訣は次のとおりです。

  • データレコードの長さとそれらがどのように構成されているかをMATLABプログラムに知らせます。
  • でデータを読む

    rest = fread(fid, 'uchar=>uint8', 'b').';
    

    sの行ベクトルを持つためにuint8

  • でデータを再形成します

    rest = reshape(rest, recordlength, []).';
    

    recordlength必要な数の列と行でデータを取得するため。

  • データ列ごとに、関連するuint8行を「サブマトリックス」に結合し、、、の組み合わせを使用してreshape、データを適切にグループ化しtypecastswapbytes目的の形式に変換します。

    ここで最も重要なことは、「バイト単位」のデータを1番目として受け入れ、必要なデータ型を2番目のパラメーターとして受け入れるtypecast()関数です。、、 (、、、および(AFAIK)のいずれかを使用)、およびなどintXX、さまざまなデータ型が受け入れられます。uintXXXX8163264floatdouble

    たとえば、typecast([1, 1], 'uint16')はあなた257に、をtypecast([0, 0, 96, 64], 'float')与えます3.5

そうすれば、テキストファイルと比較して、読み取り速度を20倍程度向上させることができます。(少なくとも、これは私がこれを書いたアプリケーションの場合でした:10ミリ秒ごとに約10の異なる測定値があり、1つの測定は数分または数時間でさえあり得、私はそのようなファイルをできるだけ速く読みたいと思いました。それで、私はテキストからバイナリにものを再コーディングし、ファクター20、またはおそらく15を取得しました-正確にはわかりません。しかし、それはたくさんありました...)

于 2012-10-31T23:25:23.940 に答える
0

あなたが言ったように、私はワークスペースを.MATファイルとして保存します。次に、その時点でワークスペースとして保存されている現在のすべての変数に含まれている値があります。ただし、ギガバイト長の配列(データ)を読み取る場合は、おそらくチャンクごとに読み取ります(RAMの制限のためか?)。その場合、ワークスペースを保存しても効果がない場合があります。

私は輸送のために何も印刷しません。私の仕事では(長い間漸近的であるため、膨大な出力があります)、fwriteを使用してすべてをバイナリファイルとして保存します。私の知る限り、テキストへの変換は遅くて費用がかかります。

これが少しお役に立てば幸いです。

于 2012-10-31T23:01:59.297 に答える