[英]Binary files: write with C++, read with MATLAB
我可以在這方面使用你的支持。 這是我的問題:
我在 C++ 代碼中有一個 2D 浮點緩沖區(在數據對象中),我使用以下代碼將其寫入二進制文件:
ptrToFile.write(reinterpret_cast<char *>(&data->array[0][0]), nbOfEltsInArray * sizeof(float));
數據包含 8192 個浮點數,我(對嗎?)從這行代碼中得到一個 32 KB(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] == [1][1] 在 MATLAB 中)都可以。 但:
對此有任何想法嗎?
謝謝再見
撇開似乎存在一些精度差異(可能是 MATLAB 中的顯示設置)的事實不談,這里的問題可能是數據的行主要和列主要排序之間的差異。 如果沒有更多細節,將很難確定。 特別是 MATLAB 是主要列,這意味着磁盤上的連續 memory 被解釋為列而不是行中的詳細順序元素。
可能的解決方案是在你的 reshape 中反轉兩個大小,並訪問索引反轉的元素。 即交換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 中的數組,但對於本身可能成本高昂的大型數組
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.