首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

MATLAB 與 C/C++ 二進制文件讀寫完全指南:數據存儲順序陷阱與跨語言互操作

     編輯:關於C++

核心陷阱:行優先 vs 列優先

C/C++:行優先 — 多維數組在內存中按行連續存儲。
MATLAB:列優先 — 多維數組在內存中按列連續存儲。

示例:2×3 矩陣 [1 2 3; 4 5 6]
C 內存順序:1,2,3,4,5,6
MATLAB 內存順序:1,4,2,5,3,6

後果:直接二進制讀寫會導致數據錯位!必須在其中一端進行轉置。

MATLAB 寫二進制文件

% 生成 2x3 雙精度矩陣
A = rand(2,3);
% 以單精度寫入
fid = fopen('test.dat', 'w');
fwrite(fid, A, 'single'); % 按列優先寫入
fclose(fid);

MATLAB 讀二進制文件

fid = fopen('test.dat', 'r');
B = fread(fid, 2*3, 'single'); % 讀取 6 個單精度數
fclose(fid);
B = reshape(B, 2, 3); % 重塑為 2x3(列優先)
% B 現為列優先順序,若需行優先用 B = B.'

C 讀取(行優先)

#include 
#include 

int main() {
    float data[6];
    FILE* fp = fopen("test.dat", "rb");
    fread(data, sizeof(float), 6, fp);
    fclose(fp);
    // data 順序:1,2,3,4,5,6 (行優先)
    // 若 MATLAB 寫入未轉置,data 實際對應 MATLAB 的列優先順序
    for (int i = 0; i < 6; ++i) printf("%f\n", data[i]);
    return 0;
}

C++ 讀取(fstream)

#include 
#include 
#include 
using namespace std;

int main() {
    vector data(6);
    ifstream fs("test.dat", ios::binary | ios::in);
    fs.read(reinterpret_cast(data.data()), sizeof(float) * 6);
    fs.close();
    for (float v : data) cout << v << endl;
    return 0;
}

解決順序不匹配:MATLAB 端轉置寫入

若 C/C++ 為主力開發語言,建議 MATLAB 寫入前轉置(非共轭轉置):

fwrite(fid, A.', 'single'); % A.' 是轉置,非 A' (共轭轉置)

此後文件內存順序為行優先,C/C++ 直接讀取即為正確矩陣佈局,無需額外轉置。

數據類型對應表

MATLABC/C++說明
singlefloat4 字節 IEEE 754
doubledouble8 字節 IEEE 754
int8/uint8int8_t/uint8_t1 字節
int16/uint16int16_t/uint16_t2 字節
int32/uint32int32_t/uint32_t4 字節
int64/uint64int64_t/uint64_t8 字節

大端/小端一致性

現代 x86/x64/ARM 均為小端序,MATLAB 和 C/C++ 默認一致。跨平台(如大端機器)需額外處理字節序轉換。

總結

  1. 必須理解行優先 vs 列優先,這是跨語言二進制互操作的核心。
  2. 建議統一以行優先為標準(C/C++ 原生),MATLAB 寫入前用 A.' 轉置。
  3. 數據類型嚴格對應,使用定長類型(int32_t 而非 int)。
  4. 大數據量時,二進制文件比文本文件快數量級,且體積小。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved