二进制文件:用C++编写,用MATLAB读取

fhg3lkii  于 2022-11-15  发布在  Matlab
关注(0)|答案(1)|浏览(233)

在这件事上我需要你的支持。我的问题是:
我在C++代码中有一个浮点数的2D缓冲区(在数据对象中),我使用以下命令将其写入二进制文件:

ptrToFile.write(reinterpret_cast<char *>(&data->array[0][0]), nbOfEltsInArray * sizeof(float));

数据包含8192个浮点数,而I(正确吗?)从此行代码中获取一个32K字节(8192*4字节)的文件。
现在,我想用MatLab读取这个二进制文件。代码是:

hdr_binaryfile = fopen(str_binaryfile_path,'r');
res2_raw = fread(hdr_binaryfile, 'float');
res2 = reshape(res2_raw, int_sizel, int_sizec);

但这并没有像我预期的那样发生。如果我使用std::cout打印C++代码中的数据数组,我会得到:

pCarte_bin->m_size = 8192
pCarte_bin->m_sizel = 64
pCarte_bin->m_sizec = 128
pCarte_bin->m_p[0][0] = 1014.97
pCarte_bin->m_p[0][1] = 566946
pCarte_bin->m_p[0][2] = 423177
pCarte_bin->m_p[0][3] = 497375
pCarte_bin->m_p[0][4] = 624860
pCarte_bin->m_p[0][5] = 478834
pCarte_bin->m_p[1][0] = 2652.25
pCarte_bin->m_p[2][0] = 642077
pCarte_bin->m_p[3][0] = 5.33649e+006
pCarte_bin->m_p[4][0] = 3.80922e+006
pCarte_bin->m_p[5][0] = 568725

在MatLab端,在我使用上面的一小段代码读取文件之后:

size(res2) = 64  128
res2(1,1) = 1014.9659
res2(1,2) = 323288.4063
res2(1,3) = 2652.2515
res2(1,4) = 457593.375
res2(1,5) = 642076.6875
res2(1,6) = 581674.625
res2(2,1) = 566946.1875
res2(3,1) = 423177.1563
res2(4,1) = 497374.6563
res2(5,1) = 624860.0625
res2(6,1) = 478833.7188

大小(行、列)以及第一项(在C中为[0][0],在MatLab中为=[1][1])都是可以的。但是:
1.我沿着列读取C
行元素:[0][1]in C++==[1][2]在matlab中(记住,在matlab中,索引从1开始),依此类推。
1.我沿着另一个维度从两个元素中读取了一个正确的元素:C++中的[1][0]==[1][3]在MATLAB中,[2][0]==[1][5],等等。
你知道这件事吗?
谢谢!再见

vlf7wbxs

vlf7wbxs1#

抛开似乎存在一些精度差异(很可能是MATLAB中的显示设置)这一事实,这里的问题可能是数据的行主要排序和列主要排序之间的差异。如果没有更多细节,就很难确定。特别是,matlab是column major,这意味着磁盘上的连续内存被解释为在一列而不是一行中详细说明顺序元素。
可能的解决方案是在重塑中颠倒两个大小,并访问索引颠倒的元素。也就是说,交换int_size1和int_size2,然后读取预期的元素

pCarte_bin->m_p[0][0] = res2(1,1)
pCarte_bin->m_p[0][1] = res2(2,1)
pCarte_bin->m_p[0][2] = res2(3,1)
pCarte_bin->m_p[0][3] = res2(4,1)
pCarte_bin->m_p[1][0] = res2(1,2)

等。
您还可以在读取后在MATLAB中转置数组,但对于大型数组,这本身可能会很昂贵

相关问题