1. 程式人生 > >[Matlab+C/C++] 讀寫二進制文件

[Matlab+C/C++] 讀寫二進制文件

二進制 statistic hidden 圖像處理 cast sheet ado tdi 讀寫

introduction

由於Matlab操作簡單、方便,它被應用於非常多領域:音頻處理,圖像處理,數值計算等。雖然MATLABeasy操作。但受限於他的語言解釋機制。MATLAB的運行速度通常較低。C/C++一般被覺得是運行較為高效的高級程序設計語言。

假設結合MATLAB和C/C++。或許我們能夠獲得操作簡便性和運行速度的折中。這樣的結合的一般形式是:MATLAB負責絕大部分工作,C/C++負責一些關鍵部分的實現。其詳細方法在我之前的博文中已經有所介紹。

在處理某些數據的時候,可能涉及到文件的讀寫,假設用MATLAB存儲為mat文件,那麽其他程序讀取這樣的數據就變得困難了。假設將數據存為文本文件,文件的解析過程就會變得比較長。幸運的是MATLAB能夠讀寫自己定義格式的二進制文件。基本全部程序語言(包含C/C++)在內。都是支持二進制文件的讀寫操作的。本文就介紹一下怎樣使用MATLAB和C/C++對二進制文件進行讀寫。


準備知識

MATLAB和C/C++並不採用同樣的規則來存儲矩陣數據。在聯合MATLAB和C/C++時,一定要註意這一點:C/C++按行存儲數據;MATLAB按列來存儲數據。舉例說明。假設我們有一個2行3列的矩陣,共2×3=6個元素。假設他的數據例如以下:
M=???147258369???.
那麽,在MATLAB中,M在內存中的存儲順序為 1,4,7,2,5,8,3,6,9. 在C/C++中的存儲順序為1,2,3,4,5,6,7,8,9. 因此內存中的同一塊數據,MATLAB和C/C++的解析結果是不同的。在實際開發過程中要特別註意這一點。


MATLAB寫矩陣到二進制文件

MATLAB提供了四個函數來讀寫二進制文件:fopen(...)

, fread(...), fwrite(...), fclose(...).

舉例說明怎樣對二進制文件進行讀寫操作:


實例1:將雙精度矩陣以單精度浮點數類型存入二進制文件

% 生成一個2行3列的雙精度浮點數類型的矩陣
A = rand(2,3);

% 在當前工作文件夾下以二進制寫方式 (‘w‘) 打開‘test.dat‘
fid = fopen(‘test.dat‘, ‘w‘);

% 將矩陣A的元素以單精度浮點數類型寫如fid關聯的二進制文件
fwrite(fid, A, ‘single‘);

% 將與fid關聯的文件關閉
fclose(fid);

實例 2:以單精度浮點數類型讀入MATLAB

% 在當前工作文件夾下以二進制讀方式 (‘r‘) 打開‘test.dat‘
fid = fopen(‘test.dat‘, ‘r‘);

% 從與fid關聯的二進制文件讀取6個元素,每一個元素以單精度浮點類型解析
B = fread(fid, 2*3, ‘single‘);

% 將與fid關聯的文件關閉
fclose(fid);

實例2中,B是一個6×1的矩陣,假設想得到與實例1中的A相似的形式,能夠這樣做:B = reshape(B, 2, 3)


C讀取二進制數據

C讀取二進制數據的方式與MATLAB相似。


實例 3: 用C語言讀取實例 1 的test.dat

// 完整的C代碼
#include <stdio.h>
#include <stdlib.h>
int main(){
    int i;
    char *filename = "test.dat";
    float data[6];  
    FILE *fs = fopen(filename, "r");
    fread((void*)data, sizeof(float), 6, fs);
    fclose(fs);
    // 顯示數據
    for (i = 0; i < 6; i++){
        printf("%f\n", data[i]);
    }
    return 0;
}

實例 3 的輸出結果跟實例 2 中讀取的B的結果是一致的。假設對實例 2 中的B用MATLAB進行reshape操作。B就會變成跟實例 1 中的A相似的存儲結構,A和B的區別僅僅在於他們的數據類型不同。實例 3 中使用data的時候。假設要想跟MATLAB一樣索引第 i 行 第 j 列的元素。則必須轉置訪問。

假設在C中有大量的興許操作,而且你的大部分重要工作用C來完畢的話。建議在MATLAB中的寫操作能夠將矩陣變換行列(不是共軛轉置)後再做寫入,改動例如以下:

fwrite(fid, A.‘, ‘single‘);

C++讀二進制文件

用C++讀二進制文件須要fstream類,實比例如以下:


實例 4 : 用C++ 讀取實例 1 寫入的test.dat

// 完整C++代碼
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main(){
    float data[6];
    string filename = "test.dat";
    ifstream fs;
    fs.open(filename, ios_base::binary | ios_base::in);
    fs.read(reinterpret_cast<char*>(data), sizeof(float)* 6);
    fs.close();
    for (int i = 0; i < 6; i++){
        cout << data[i] << endl;
    }
    return 0;
}

總結

使用MATLAB和C/C++能夠較快的完畢算法的開發的同一時候,獲得一個較快運行速度的程序。

在聯合使用MATLAB和C/C++時,一定要註意數據的存儲順序。

[Matlab+C/C++] 讀寫二進制文件