首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从C++文件中导入5级MAT-文件格式数据

从C++文件中导入5级MAT-文件格式数据
EN

Stack Overflow用户
提问于 2012-01-19 11:30:29
回答 1查看 1.7K关注 0票数 0

我正在用C++编写一个函数,根据MATLAB文件格式2011 1B doc加载MAT文件(第5级)格式(参见www.mathworks.com/help/pdf_doc/matlab/matfile_format.pdf). )

由于字节数字段为零,我肯定遗漏了一些东西(可能是C++)。可以像读取数据类型元素标志一样成功地读取MAT文件头,但是字节数不是。加载mat文件的代码如下:

代码语言:javascript
复制
// 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;

产出如下:

代码语言:javascript
复制
MATLAB 5.0 MAT-file, Platform: GLNXA64, Created on: Fri May 20 18:21:46 2011


IM
15
0

我从MATLAB中得到了以下信息:

世界卫生组织-file PaviaU.mat 名称大小Bytes类属性 paviaU 610x340x103 170897600双

我是否以某种方式错误地从头加载数据?为什么字节数等于零?

编辑:如果我按以下方式读取数据元素(sa在一条评论中建议):

代码语言:javascript
复制
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 (二进制代码)上得到了意想不到的值

但是调试函数时,我可以检查这两个变量:

代码语言:javascript
复制
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又如何呢?那是哪个号码?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-01-19 16:50:41

根据规范,您的结果显示数据类型是

miCOMPRESSED:压缩数据

size字段显示数据大小为0x02131BFD或34,806,781字节。与原始的170 on大小相比,根据数据的不同,这种压缩比似乎是合理的。

假设您可以节省140 as,那么将文件保存为未压缩的数据可能会更容易。保存为旧的.mat版本禁用压缩(mathworks)。我不知道在新的.mat文件中禁用它的方法。

编辑

大小和数据类型字段可以更好地理解为:

代码语言:javascript
复制
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));

这可以直接完成,因为您的机器是小终端。如果endian字段的结果正好相反,那么在将它们存储到uint32中之前,您必须交换所有字节的顺序。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8925290

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档