Matlab C C 讀寫二進位制檔案

2021-07-10 08:36:39 字數 2372 閱讀 9692

因為matlab操作簡單、方便,它被應用於很多領域:音訊處理,影象處理,數值計算等。儘管matlab容易操作,但受限於他的語言解釋機制,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=

⎡⎣⎢1

4725

8369

⎤⎦⎥.

那麼,在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提供了四個函式來讀寫二進位制檔案: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讀取二進位制資料的方式與matlab類似。

例項 3: 用c語言讀取例項 1 的test.dat

// 完整的c**

#include

#include

int main()

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++讀二進位制檔案需要fstream類,例項如下:

例項 4 : 用c++ 讀取例項 1 寫入的test.dat

// 完整c++**

#include

#include

#include

using

namespace

std;

int main()

return

0;}

使用matlab和c/c++可以較快的完成演算法的開發的同時,獲得乙個較快執行速度的程式。

在聯合使用matlab和c/c++時,一定要注意資料的儲存順序。

二進位制檔案讀寫

define crt secure no warnings include include include size t fread void buffer,size t size,size t count,file stream size t fwrite const void buffer,si...

二進位制 二進位制起源

現代通訊技術的基礎是二進位制編碼。早在1865年麥克斯韋總結出麥克斯韋方程組之前,美國人摩斯 morse 於1837年發明了摩斯電碼和有線電報。有線電報的出現,具有劃時代的意義 它讓人類獲得了一種全新的資訊傳遞方式,這種方式 看不見 摸不著 聽不到 完全不同於以往的信件 旗語 號角 烽火,這也是二進...

C 讀寫二進位制檔案

摘要 使用c 讀寫二進位制檔案,在開發中操作的比較頻繁,今天有幸找到一篇文章,遂進行了一些試驗,並進行了部分的總結。使用c 操作檔案,是研發過程中比較頻繁的,因此進行必要的總結和封裝還是十分有用的。今天在網上找到一篇,遂進行了部分的試驗,以記之,備後用。include 寫二進位制檔案 寫二進位制檔案...