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
後果:直接二進制讀寫會導致數據錯位!必須在其中一端進行轉置。
% 生成 2x3 雙精度矩陣
A = rand(2,3);
% 以單精度寫入
fid = fopen('test.dat', 'w');
fwrite(fid, A, 'single'); % 按列優先寫入
fclose(fid);
fid = fopen('test.dat', 'r');
B = fread(fid, 2*3, 'single'); % 讀取 6 個單精度數
fclose(fid);
B = reshape(B, 2, 3); % 重塑為 2x3(列優先)
% B 現為列優先順序,若需行優先用 B = B.'
#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;
}
#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;
}
若 C/C++ 為主力開發語言,建議 MATLAB 寫入前轉置(非共轭轉置):
fwrite(fid, A.', 'single'); % A.' 是轉置,非 A' (共轭轉置)
此後文件內存順序為行優先,C/C++ 直接讀取即為正確矩陣佈局,無需額外轉置。
| MATLAB | C/C++ | 說明 |
|---|---|---|
single | float | 4 字節 IEEE 754 |
double | double | 8 字節 IEEE 754 |
int8/uint8 | int8_t/uint8_t | 1 字節 |
int16/uint16 | int16_t/uint16_t | 2 字節 |
int32/uint32 | int32_t/uint32_t | 4 字節 |
int64/uint64 | int64_t/uint64_t | 8 字節 |
現代 x86/x64/ARM 均為小端序,MATLAB 和 C/C++ 默認一致。跨平台(如大端機器)需額外處理字節序轉換。
A.' 轉置。int32_t 而非 int)。