matlab是美國mathworks公司出品的商業數學軟體,用於演算法開發、資料視覺化、資料分析以及數值計算的高階技術計算語言和互動式環境,主要包括matlab和simulink兩大部分。一言以蔽之——很牛很強大!
如果在專案中把資料儲存為mat檔案,這對於演算法分析來說簡直就是雪中送炭啊。matlab可是pc軟體啊,在pc上借助matlab生成mat格式檔案很好實現,那如何在嵌入式專案中生成matlab檔案呢?
網上搜尋資料發現乙個matio(mat file i/o library),matio是乙個基於c語言的對matlab格式檔案讀寫操作的庫。基於c語言的話,那可移植性自然是極好的。
那matlab檔案格式到底長啥樣子呢?
mat-file formatmathworks公司官網有這個檔案格式的說明。這篇文件描述了mat-file的level 4和level 5的格式說明,我們就理解為mat-file的版本4和版本5吧,上面說了版本4比較老,版本5算是比較新的,但是現在其檔案版本已經7.3了,下面會說到這個事情。總之,說了這個matlab檔案格式,是二進位制格式,不是給人看的,看起來很不直觀。
我們大概了解一下matlab檔案格式就行了
我們心裡已經有個譜了,開始進行編譯。
zlib庫編譯參看我之前文件交叉編譯zlib
解壓matio-1.5.12.tar.gz
tar zxvf matio-
1.5.12
.tar.gz
cd matio-
1.5.12
/./configure --host=arm-none
-linux
-gnueabi
--prefix=
$pwd/install --
with
-default
-file
-ver=5
--with
-zlib
=/home/
.../zlib-
1.2.11/install
指定預設版本是5,連線zlib庫的目錄,注意zlib庫目錄要寫絕對路徑
發現配置出錯
checking for va_copy() function... configure: error: in `/home/.../matio-1.5
.12':
configure: error: cannot run test program while cross compiling
see `config.log' for more details
根據錯誤資訊在configure文中查詢錯誤發生處:
: checking for va_copy() function" >&5
$as_echo_n
"checking for va_copy() function... " >&6; }
if$false; then :
$as_echo_n
"(cached) " >&6
從中可知變數ac_cv_va_copy無法被自動配置上,所以:
echo ac_cv_va_copy=yes > arm-linux
.cache
./configure --host=arm-none
-linux
-gnueabi
--prefix=
$pwd/install --
with
-default
-file
-ver=5
--cache
-file
=arm-linux
.cache
--with
-zlib
=/home/
.../zlib-
1.2.11/install
我們可以看到配置成功的顯示輸出:
最後,執行make
make && make install
進到install目錄下面會看到四個目錄:bin、include、lib、share。我們主要需要include頭檔案目錄和lib庫目錄,裡面有靜態庫和共享庫。
由於專案中用到的是寫mat檔案,我們這裡只展示乙個寫mat檔案的例子,這個例子在matio_user_guide.pdf的2.3.3節,writing structure arrays。
編寫原始碼檔案,main.c
#include
#include
#include "matio.h"
int main(int argc,char **argv)
, struct_dims[2] = ;
double x1[10] = ,
x2[10] = ,
y1[10] = ,
y2[10] = ;
struct mat_complex_split_t z1 = , z2 = ;
const
char *fieldnames[3] = ;
unsigned nfields = 3;
matfp = mat_createver("test.mat",null,mat_ft_default);
if ( null == matfp )
matvar = mat_varcreatestruct("a", 2,struct_dims,fieldnames,nfields);
if ( null == matvar )
/* structure index 0 */
field = mat_varcreate(null,mat_c_double,mat_t_double,2,dims,x1,0);
mat_varsetstructfieldbyname(matvar,"x",0,field);
field = mat_varcreate(null,mat_c_double,mat_t_double,2,dims,y1,0);
mat_varsetstructfieldbyname(matvar,"y",0,field);
field = mat_varcreate(null,mat_c_double,mat_t_double,2,dims,&z1,mat_f_complex);
mat_varsetstructfieldbyname(matvar,"z",0,field);
/* structure index 1 */
field = mat_varcreate(null,mat_c_double,mat_t_double,2,dims,x2,0);
mat_varsetstructfieldbyname(matvar,"x",1,field);
field = mat_varcreate(null,mat_c_double,mat_t_double,2,dims,y2,0);
mat_varsetstructfieldbyname(matvar,"y",1,field);
field = mat_varcreate(null,mat_c_double,mat_t_double,2,dims,&z2,mat_f_complex);
mat_varsetstructfieldbyname(matvar,"z",1,field);
mat_varwrite(matfp,matvar,mat_compression_none);
mat_varfree(matvar);
mat_close(matfp);
return exit_success;
}
**中大概能看明白,生成的檔案名叫test.mat,裡面有乙個大結構資料叫a,a下面有兩個小結構資料,每個小結構資料裡面有x,y,z三維陣列資料,下面我們來看一下,生成的檔案結果是不是這樣呢?
接下來進行交叉編譯,注意編譯時候一定要鏈結libz庫。
然後把這個可執行程式放到板子上執行,把生成的mat格式檔案拿出來,放到我們pc上用matlab軟體檢視一下:
結果正如我們**中寫的那樣。
原始碼目錄下面有乙個visual_studio目錄,進去開啟matio.sln,編譯好之後就可以在pc下玩了(注意可能會依賴hdf5和zlib庫)。不是我們重點,在這裡不多做說明。
我不是正版「格列寧」(matlab),我是開源「格列寧」(matio)
Matlab 讀寫yuv檔案
clear all clc fid fopen data testing down.yuv r 讀入檔案 fod fopen data testing test.yuv w 輸出檔案 row 768 2 col 1024 2 影象的高 寬 frames 97 total 97 序列的幀數 for f...
MATLAB如何讀寫檔案
很多時候,使用matlab生成資料和處理是一種不錯的選擇,往往需要讀取指定路徑的檔案,有時候還需要遍歷檔案,或者將處理的資料儲存在指定路徑的檔案之中,那麼如何使用matlab來讀寫檔案呢?if exist d path dir mkdir d path endfid fopen path,r pro...
matlab讀寫Excel檔案
examp7.2 1 code by ariszheng gmail.com 2010 6 22 檔名稱 excel.xls typ,desc,fmt xlsfinfo excel.xls 檔案在當前工作目錄下,直接輸入檔名稱即可。system taskkill f im excel.exe exa...