我在使用MATLAB中创建的.bin格式读取C中的大型数组时遇到了问题。以下是我的代码。我已经测试了它的简单数组[1,2; 3,4],它工作正常。但对于我想要的尺寸为256 x 256且值较小的矩阵,我会得到意想不到的结果。
FILE * fileptr;
double * buffer;
int num_read;
fileptr = fopen("matrix.bin", "rb");
if (fileptr == NULL)
{
printf("couldn't read file\n");
}
else
{
buffer = malloc(sizeof(double) * 256 * 256);
check_mem(buffer);
num_read = fread(buffer, sizeof(double), 256 * 256, fileptr);
fclose(fileptr);
printf("num read: %d\n", num_read);
printf("buffer: %.16f\n", buffer[0]);
}
---------------------------------------------------------------------
output:
num read: 65536
buffer = 0.0000000000016900;
在MATLAB中,矩阵通常用1.4e-5到1.6e-5的数字填充。但我用一个填充了1的相同大小的矩阵测试它,我得到了相同的结果。出于某种原因,我能够使用索引>索引到缓冲区数组中。 65535(256 * 256),之后有一些垃圾值。所以可能存在一些内存对齐问题。
在MATLAB中,我执行以下命令来写入bin文件。
fid = fopen('matrix.bin', 'wb');
fwrite(fid, matrix, 'double');
fclose(fid);
我正在Windows上运行MATLAB(little-endian)和Ubuntu(也是little-endian)上的C代码。为了以防万一,我强迫MATLAB用小端编写bin文件,但它也没有帮助。
答案 0 :(得分:0)
好的,我已经成功解决了这个问题。 MATLAB打开或将数据写入现有二进制文件的方式存在一些问题。我不认为使用相同的名称二进制文件会有所作为,但每次我将名称更改为新的时它都有效。 fopen和fwrite的文档明确指出现有文件被覆盖。但是,即使我删除了文件本身,问题仍然会发生,所以也许名称不能从缓冲区中正确刷新。我现在正在Ubuntu,Bless中使用HEX编辑器检查每个bin文件,以验证是否复制了正确的矩阵,以防止将来出现问题。谢谢大家的帮助。