因為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:以單精度浮點數型別讀入matlab% 生成乙個2行3列的雙精度浮點數型別的矩陣
a = rand(2,3);
% 在當前工作目錄下以二進位制寫方式 ('w') 開啟'test.dat'
fid = fopen('test.dat', 'w');
% 將矩陣a的元素以單精度浮點數型別寫如fid關聯的二進位制檔案
fwrite(fid, a, 'single');
% 將與fid關聯的檔案關閉
fclose(fid);
例項2中,b是乙個6% 在當前工作目錄下以二進位制讀方式 ('r') 開啟'test.dat'
fid = fopen('test.dat', 'r');
% 從與fid關聯的二進位制檔案讀取6個元素,每個元素以單精度浮點型別解析
b = fread(fid, 2*3, 'single');
% 將與fid關聯的檔案關閉
fclose(fid);
×1的矩陣,如果想得到與例項1中的a類似的形式,可以這樣做:b = reshape(b, 2, 3)
c讀取二進位制資料的方式與matlab類似。
例項 3: 用c語言讀取例項 1 的test.dat
例項 3 的輸出結果跟例項 2 中讀取的b的結果是一致的。如果對例項 2 中的b用matlab進行reshape操作,b就會變成跟例項 1 中的a類似的儲存結構,a和b的差別只在於他們的資料型別不同。例項 3 中使用data的時候,如果要想跟matlab一樣索引第 i 行 第 j 列的元素,則必須轉置訪問!// 完整的c**
#include
#include
int main()
return
0;}
如果在c中有大量的後續操作,並且你的大部分重要工作用c來完成的話,建議在matlab中的寫操作可以將矩陣變換行列(不是共軛轉置)後再做寫入,修改如下:
fwrite(fid, a.', 'single');
用c++讀二進位制檔案需要fstream類,例項如下:
例項 4 : 用c++ 讀取例項 1 寫入的test.dat
使用matlab和c/c++可以較快的完成演算法的開發的同時,獲得乙個較快執行速度的程式。// 完整c++**
#include
#include
#include
using
namespace
std;
int main()
return
0;}
在聯合使用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 寫二進位制檔案 寫二進位制檔案...