使用从MATLAB到C的bin文件读取和写入大数组的意外结果

时间:2015-09-11 01:23:32

标签: c arrays matlab

我在使用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文件,但它也没有帮助。

1 个答案:

答案 0 :(得分:0)

好的,我已经成功解决了这个问题。 MATLAB打开或将数据写入现有二进制文件的方式存在一些问题。我不认为使用相同的名称二进制文件会有所作为,但每次我将名称更改为新的时它都有效。 fopen和fwrite的文档明确指出现有文件被覆盖。但是,即使我删除了文件本身,问题仍然会发生,所以也许名称不能从缓冲区中正确刷新。我现在正在Ubuntu,Bless中使用HEX编辑器检查每个bin文件,以验证是否复制了正确的矩阵,以防止将来出现问题。谢谢大家的帮助。