matlab檔案讀寫庫(matio),了解一下?

2021-08-21 12:24:34 字數 4378 閱讀 7189

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...