簡體   English   中英

二進制文件:用 C++ 寫入,用 MATLAB 讀取

[英]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 中)都可以。 但:

  1. 我正在閱讀沿列的 C++ 行元素: [0][1] in C++ == [1][2] in Z8F6823ABD383A341F0D78EF38829BB BBZ 等(記住索引從 MATLAB 中的 1 開始)
  2. 我正在沿另一個維度從兩個中讀取一個正確的元素:C++ 中的 [1][0] == MATLAB 中的 [1][3]、[2][0] == [1][5] 等.

對此有任何想法嗎?

謝謝再見

撇開似乎存在一些精度差異(可能是 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM