[Matlab+C/C++]読み書きバイナリファイル


introduction
Matlabは操作が簡単で便利であるため,オーディオ処理,画像処理,数値計算など多くの分野に応用されている.MATLABは操作しやすいが,彼の言語解釈メカニズムに限られ,MATLABの実行速度は通常低い.C/C++は一般的により効率的な高度なプログラム設計言語とされている.MATLABとC/C++を組み合わせると,操作の簡便性と実行速度の折衷が得られるかもしれない.この結合の一般的な形式は:MATLABはほとんどの仕事を担当し、C/C++はいくつかの肝心な部分の実現を担当し、その具体的な方法は私の前のブログですでに紹介されています.
いくつかのデータを処理する場合、ファイルの読み書きにかかわる可能性があり、MATLABでmatファイルとして格納すると、他のプログラムがこのようなデータを読み取ることが難しくなります.データをテキストファイルとして保存すると、ファイルの解析プロセスが長くなります.幸いなことにMATLABはカスタムフォーマットのバイナリファイルを読み書きすることができ、基本的にすべてのプログラム言語(C/C++)を含めて、バイナリファイルの読み書き操作をサポートしています.ここでは、MATLABとC/C++を使用してバイナリファイルを読み書きする方法について説明します.
知識の準備
MATLABとC/C++はマトリクスデータを格納するために同じ規則を採用していません!MATLABとC/C++を組み合わせる場合は、C/C++が行ごとにデータを格納することに注意してください.MATLABはカラムごとにデータを格納する.例として、2行3列のマトリクスが2つあるとします.× 3=6の要素で、彼のデータは次のように仮定されます.
M=⎡⎣⎢147258369⎤⎦⎥.
さてMATLABでは、
メモリにおけるMの格納順序は1,4,7,2,5,8,3,6,9である.C/C++における格納順序は1,2,3,4,5,6,7,8,9である.従ってメモリ内の同一ブロックのデータはMATLABとC/C++の解析結果が異なる.実際の開発過程ではこの点に特に注意しなければならない.
MATLAB書き込みマトリクスをバイナリファイルに
MATLABは4つの関数を提供してバイナリファイルを読み書きする:fopen(...),fread(...),fwrite(...),fclose(...).
バイナリ・ファイルの読み書き方法を例に示します.
例1:デュアル精度マトリクスをシングル精度浮動小数点数タイプでバイナリファイルに格納
%     2 3             
A = rand(2,3);

%                 ('w')   'test.dat'
fid = fopen('test.dat', 'w');

%    A              fid        
fwrite(fid, A, 'single');

%   fid       
fclose(fid);

例2:MATLABを単精度浮動小数点数タイプで読み込む
%                 ('r')   'test.dat'
fid = fopen('test.dat', 'r');

%   fid          6   ,              
B = fread(fid, 2*3, 'single');

%   fid       
fclose(fid);

例2では、Bは6である× 1の行列は、実施例1のAと同様の形式を得るためには、B = reshape(B, 2, 3)とすることができる.
Cバイナリデータの読み出し
Cバイナリデータの読み出し方はMATLABと同様である.
例3:例1のtestをC言語で読み出す.dat
//    C  
#include 
#include 
int main(){
    int i;
    char *filename = "test.dat";
    float data[6];  
    FILE *fs = fopen(filename, "r");
    fread((void*)data, sizeof(float), 6, fs);
    fclose(fs);
    //     
    for (i = 0; i < 6; i++){
        printf("%f
"
, data[i]); } return 0; }

実施例3の出力結果は、実施例2で読み取ったBの結果と一致する.インスタンス2のBに対してMATLABを用いてreshape操作を行うと,Bはインスタンス1のAと同様の記憶構造となり,AとBの差はそれらのデータ型が異なるだけである.インスタンス3でdataを使用する場合、MATLABと同様にi行j列目の要素をインデックスするには、アクセスを転置する必要があります!
Cに後続の操作が多く、重要な作業の大部分がCで完了している場合は、MATLABでの書き込み操作でマトリクス変換行列(共役転置ではない)を書き込み、以下のように修正することをお勧めします.
fwrite(fid, A.', 'single');

C++読み込みバイナリファイル
C++でバイナリファイルを読み込むにはfstreamクラスが必要です.例は次のとおりです.
例4:例1に書き込むtestをC++で読み出す.dat
//   C++  
#include 
#include 
#include 
using namespace std;
int main(){
    float data[6];
    string filename = "test.dat";
    ifstream fs;
    fs.open(filename, ios_base::binary | ios_base::in);
    fs.read(reinterpret_cast<char*>(data), sizeof(float)* 6);
    fs.close();
    for (int i = 0; i < 6; i++){
        cout << data[i] << endl;
    }
    return 0;
}

まとめ
MATLABとC/C++を用いてアルゴリズムの開発を迅速に完了するとともに,より高速な実行速度のプログラムを得ることができる.
MATLABとC/C++を併用する場合は、必ずデータの格納順序に注意してください.