2012-01-19 8 views
0

MATLAB® MATファイル形式2011b文書に基づいてMATファイル(レベル5)形式を読み込む関数をC++でコーディングしていますwww.mathworks.com/help/pdf_doc/matlab/matfile_format.pdf)。import Level 5 MATファイル形式のデータをC++のファイルから取得

バイト数フィールドがゼロであるため、何かが不足している可能性があります(おそらくC++で)。 MAT-Fileヘッダーは、データ型要素のフラグと同様に正常に読み取られますが、バイト数は正しく読み込まれません。次のようにマットのファイルをロードするためのコードの一部は次のとおりです。

// file handler 
ifstream file; 
// open file 
file.open(i_file, ifstream::in | ifstream::binary); 
// check for errors 
if (!file) return NULL; 

/********** BEGIN MAT-File Header **********/ 
char header_text[116], header_offset[8], header_version[2], header_endian[2]; 
// The first 116 bytes of the header can contain text data in human-readable form. 
file.read((char*) &header_text, 116); cout << header_text << endl; 
/* Header Subsystem Data Offset Field */ 
// Bytes 117 through 124 of the header contain an offset to subsystem-specific 
// data in the MAT-file. 
file.read((char*) &header_offset, 8); cout << header_offset << endl; 
/* Header Flag Fields */ 
// Version When creating a MAT-file, set this field to 0x0100. 
file.read((char*) &header_version, 2); cout << header_version << endl; 
// Endian Indicator. Contains the two characters, M and I, written to the 
// MAT-file in this order, as a 16-bit value. 
file.read((char*) &header_endian, 2); cout << header_endian << endl; 

/********** END MAT-File Header **********/ 

/********** BEGIN MAT-File Data Element **********/ 

/* The Tag Field */ 
// The 8-byte data element tag is composed of two, 32-bit fields 
// Data Type 
__int32_t data_type = file.get(); cout << data_type << endl; 
// Number of Bytes 
__int32_t num_bytes = file.get(); cout << num_bytes << endl; 

次のように出力されている:

MATLAB 5.0 MAT-file, Platform: GLNXA64, Created on: Fri May 20 18:21:46 2011 


IM 
15 
0 

MATLABから、私は情報を得る:PaviaU -file

玉葉.mat

名前サイズバイトクラス属性

paviaU 610x340x103 170897600ダブル

私が間違って何とかヘッダからデータをロードしましたか? なぜバイト数はゼロに等しいですか?

編集:次のように私は、データ要素を読めば(SAは1つのコメントで提案されている):

char data_type[4], num_bytes[4]; 
file.read((char*) &data_type, 4); cout << data_type << endl; 
file.read((char*) &num_bytes, 4); cout << num_bytes << endl; 

私はcout(バイナリコード)に予期しない値を取得

しかし、デバッグ関数私は両方の変数を検査することができます:

data_type[0] = 15 
data_type[1] = 0 '\0' 
data_type[2] = 0 '\0' 
data_type[3] = 0 '\0' 

num_bytes[0] = -3/253 
num_bytes[1] = 27 
num_bytes[2] = 19 
num_bytes[3] = 2 

data_typeの値は15ですがnum_bytesの-3/253はどうですか?それはどれですか?仕様によると、あなたの結果は、データ型を示す

+0

コード例のコメントでは、タグが2つの32ビットフィールドで構成されているとしています。しかし、あなたは2バイト(通常は16ビット)しか読みません。 'get()'は 'char'を1つだけ読み込みます。 – jrok

+0

'file.read((char *)&data_type、4);'と 'file.read((char *)&num_bytes、4)'を試してください。 – jrok

+0

@jrok提案していただきありがとうございます。新しい出力で質問を更新しました。 – pQB

答えて

1

はmiCOMPRESSED

です:圧縮データ

サイズフィールドは、データサイズが0x02131BFDまたは34806781バイトであることを示しています。元の170MBのサイズと比較して、この圧縮率はデータに応じて妥当と思われます。

140MBをスペアすると仮定すると、ファイルを圧縮されていないデータとして保存する方が簡単でしょう。圧縮されていない古い.matバージョンとして保存します(mathworks)。私は新しい.matファイルでそれを無効にする方法を知らない。

編集

サイズとデータ型のフィールドは、より良いとして読み取ることができます:

uint32_t data_type, num_bytes; 
file.read(reinterpret_cast<char*>(&data_type), sizeof(uint32_t)); 
file.read(reinterpret_cast<char*>(&num_bytes), sizeof(uint32_t)); 

あなたのマシンがリトルエンディアンであるとして、これが直接行うことができます。エンディアンフィールドの結果は反対ですが、uint32に格納する前にすべてのバイトの順序を入れ替える必要があります。

+0

あなたの提案をありがとう。私はnum_bytesの値に関してまだ見当たりません。どのように0x02131BFDの値を取得しましたか? – pQB

+1

投稿した配列。 num_bytes = {2、19、27、253}。 16進数では、{0x02、0x13、0x1B、0xFD}です。 4バイトの語として扱われ、0x02131BFDです。 – Jonathan

+0

これをすべて行うのではなく、単語に直接読み込むことができます。つまり、 'uint32_t num_bytes; file.read(&num_bytes、4); ' – Jonathan

関連する問題