.mat
matlab で DCT コードを実行していますが、圧縮ファイル ( ) を ac コードに読み込みたいと考えています。ただし、これが正しいかどうかはわかりません。コードはまだ完成していませんが、自分のファイルから C++ で読み取り可能なファイルを作成する方法について説明を求めたいと思い.mat
ます。
.mat
ファイルの詳細については、.txt
バイナリ、フロートの詳細についてはちょっと混乱しています。誰か私にこれを説明してください。
.mat
matlab で DCT コードを実行していますが、圧縮ファイル ( ) を ac コードに読み込みたいと考えています。ただし、これが正しいかどうかはわかりません。コードはまだ完成していませんが、自分のファイルから C++ で読み取り可能なファイルを作成する方法について説明を求めたいと思い.mat
ます。
.mat
ファイルの詳細については、.txt
バイナリ、フロートの詳細についてはちょっと混乱しています。誰か私にこれを説明してください。
正確なニーズ、時間、およびスキルレベル (Matlab と C++ の両方) に応じて、ここには多くのオプションがあるようです。明らかなものは次のとおりです。
アスキーファイル
構文を使用して Matlab で ASCII ファイルを生成することもsave(filename, variablename, '-ascii')
、c スタイルのコマンドを使用してよりカスタムな形式を作成することもできfprintf
ます。次に、C または C++ プログラム内で、ファイルはfscanf
.
多くの場合、これが最も簡単であり、多くの場合で十分です。人間がメモ帳 ++ や emacs などを使用してファイルを読み取ることができるという事実は、適切な健全性チェックです (ただし、これはしばしば過大評価されています)。
デメリットは大きく2つあります。まず、ファイルが非常に大きい (8 バイトの倍精度数を ASCII で格納するには、約 19 バイトが必要です)。第 2 に、避けられない精度の低下を最小限に抑えるために細心の注意を払う必要があります。
ディスク上のバイト数
数値の単純な配列 (たとえば、32 行 32 列の double の配列) の場合、fwrite
Matlab 関数を使用して配列をディスクに書き込むことができます。次に、C/C++ 内で並列fread
関数を使用します。
これは精度の損失がなく、非常に高速で、ディスク上のサイズが比較的小さいです。
このアプローチの欠点は、複雑な Matlab 構造を必ずしも保存できないことです。
Mathworks 提供の C ライブラリ
これは非常に一般的な問題であるため、Mathworks は *.mat ファイルの読み取り/書き込みに必要な関数を直接 C で実装することにより、実際にこれを解決しました。私はこの特定のライブラリを使用したことはありませんが、一般に、提供されるライブラリは非常に簡単に統合できます。ここからいくつかのドキュメントを見つけることができます: http://www.mathworks.com/help/matlab/read-and-write-matlab-mat-files-in-cc-and-fortran.html
これは、サポートされている主流の Matlab ツールセットの一部であるため、かなり堅牢なソリューションであり、変更の影響を比較的受けにくいはずです。
HDF5 ベースの *.mat ファイル
最近のバージョンの Matlab では、表記法を使用して、save(filename, variablename, '-v7.3');
Matlab に強制的にファイルを HDF5 ベースの形式で保存させることができます。その後、HDF5 グループのツールを使用してファイルを処理できます。Java ベースの適切な GUI ビューア ( http://www.hdfgroup.org/hdf-java-html/hdfview/index.html#download_hdfview ) と、C、C++、および Fortran 用のライブラリに注意してください。
これは、バイナリ データを保存するための壊れにくい方法です。コードでライブラリを機能させるのも少し手間がかかります。
1 つの欠点は、Mathworks が Matlab データ型を HDF5 ファイルにマップする方法の詳細を変更する可能性があることです。本当に頑丈になりたいなら、試してみてください...
カスタム HDF5 ファイル
Mathworks が使用することを決定した形式をそのまま採用する代わりに、HDF5 ファイルを直接作成し、Matlab からデータをプッシュすることはそれほど難しくありません。これにより、圧縮、チャンク サイズ、データセットの階層、名前などを制御できます。また、デフォルトの *.mat ファイル形式が今後変更されることもありません。h5write
Matlabのコマンドを参照してください。
C/C++ 側から実行するのはまだ少し手間がかかるため、プロジェクトで保証されている場合にのみ、このパスを使用します。
.mat
MATLAB 自体の特別な形式です。できることは、.mat
ファイルを MATLAB ワークスペースにロードすることです。
load file.mat
次に、 と を使用fopen
しfprintf
てデータを書き込むfile.txt
と、そのファイルの内容を C で読み取ることができます。
既に述べたことに加えて、-ascii を使用して MATLAB からデータを保存できます。
save x.mat x
なる:
save x.txt x -ascii
また、matlab のdlmwriteを使用して、区切り記号付きの asci ファイルに書き込むこともできます。このファイルは、C で読みやすく (人間も読みやすい)、問題の核心である場合は圧縮されていない可能性があります。