1.matlab文件打開與關閉
文件的打開與關閉
對一個文件操作以前,必須先打開這個文件
fopen函數:用於打開文件,調用格式為
其中,fid為文件識別號,
成功打開文件時,fid返回一個整數,用來標識該文件
打開不成功時,fid為-1
filename指定待操作的文件名
permission為對文件的允許使用方式
文件的使用方式
這是默認方式,如果指定的文件不存在,fopen的返回值為-1
如果指定的文件不存在,就創建一個文件再打開它;如果存在,就打開該文件,並清空原內容
當文件操作結束后,應該關閉文件,
fclose函數,用於關閉已打開的文件,調用格式為
fid是要關閉文件的標識號,如果fid為all,則關閉所有已打開的文件(但是標准文件除外,屏幕,鍵盤)
返回0,表示關閉成功 ; 返回-1,表示關閉不成功
文本文件的讀寫
fscanf函數用於讀取文本文件的內容,fprintf函數用於將數據寫入文本文件中,調用格式為
A用於存放讀寫的數據,
count返回成功讀寫的數據單元元素個數
fid為文件標識號
fmt用以控制讀取的數據格式
size用於指定A的大小
size:用於存放返回數據變量a的大小
以讀方式打開文件
讀入標題行,指定按字符串格式讀取數據,6指定讀取6個字符串
定義用於存放數據的變量qxsj,並初始化為空
用循環結構讀取前十行數據,因為每一行既有文本類型的數據,又有數字類型的數據,所以用單元數組讀入存儲的數據
%s指定讀取時采用字符串格式
%f指定讀取時采用小數形式
第1,2,6列為字符型數據
讀取完成之后,調用fclose函數釋放內存空間
二進制文件的讀寫
如加密或者壓縮的文件,多媒體文件,
matlab函數提供了fread函數和fwrite函數
fread函數用於讀取二進制文件,fwrite函數將數據寫入文件
函數調用格式:
A用於存放讀寫的數據,
count返回讀寫成功的數據個數
fid為文件識別
precision指定讀寫數據的類型
size用於指定A的大小
skip成為循環因子,指定按比例周期性地跳過一些數據,默認為0
以寫方式打開文件
根據給定的數學表達式求取y變量,每個變量有100個元素
將這個變量以雙精度格式寫入文件,最后關閉文件
然后運行,生成大小1600字節的文件
文件的大小跟文件個數和數據類型有關
2.matlab文件操作
fseek函數,用於改變文件指針的位置,調用格式為
指定指針從當前位置移動到文件頭
指定指針移動到文件的倒數第五個字節
ftell函數
用於查詢文件指針的當前位置,調用格式為
feof函數
用於判斷當前的文件位置指針是否到達文件尾部,調用格式
以讀方式打開文件
調用fseek函數改變文件位置,每組有兩個數據,每個數據是雙精度型,占8個字節
創建變量,並初始化為空
里用循環結構讀取數據,feof表示未到文件尾
每次讀取一個雙精度數據,添加到x,y中,直到文件末尾
繪制圖形,關閉文件
3.在其他語言程序中讀寫matlab的數據文件
MAT文件
MAT文件是matlab村塾數據的標准格式,
MAT中不僅保存變量的值,而且保存變量的名稱和類型
MAT分為標志和數據兩個部分
標志:包含數據類型,數據大小
save命令
load命令
libmat.lib:包含對MAT文件的操作函數
libmx.lib:包含對MAT文件中mxArray矩陣的操作函數
C++程序中MAT文件的基本操作
首先定義指向MAT文件的指針
MATFile *mfp;
MATFile指定指針類型,mfp為指針變量
對MAT文件進行操作前必須先打開這個文件
關閉文件
r:只讀模式(默認)
w:只寫模式
u:更新模式,既可以從文件中讀取數據,又可以寫
讀寫MAT文件
matPutVariable(mfp,name,mp) :向文件中寫入數據
matGetVariable(mfp,name):向文件中讀取數據。導入內存
函數執行成功,返回0,否則返回一個非0值
mxCreateDoubleScalar:用於創建一個數字標量
mxCreateDoubleMatrix:用於創建存儲數值數據的mxArray矩陣
mxCreateString:創建存儲變量的mxArray變量
mxDestroyArray用於清除
mxlsDouble判斷存儲的數據是否為實數
mxGetM獲取變量大小
mxSetPr:獲取變量地址
mxArrayToString:將mxArray內容轉換成字符串
在文件頭mat.h中包含了對matfile類型的定義和MAT文件的操作方法
因此,在文件首加入宏命令,
打開失敗
文件打開成功,繼續操作文件
雙精度標量,pa1指向這個對象
pa2指向雙精度實型數,大小3*3矩陣
利用memcpy將data數組中的值復制給pa2所指向矩陣的元素
pa3指向一個字符變量
調用matPutVariable函數將pa1所指變量寫入文件,變量名為LocalDouble
在寫的時候如果發生錯誤,就輸出相應的提示,中斷程序
調用matPutVariableAsGlobal,將pa2所指變量寫入文件,指定對象GlobalDouble為全局變量
調用matPutVariable,將pa3所指變量寫入文件
數據輸出操作完成后,清除矩陣,並關閉mat文件,釋放讀寫占用的內存資源
原程序編寫好之后,需要生成應用程序
在matlab命令行窗口輸入以下命令
編譯成功生成一個可執行文件
工作區中會增加3個變量
在matlab和c++之間交換數據
4.在matlab中調用其它語言編寫的程序
如何在matlab中調用其它語言編寫的程序
MEX是matlab Executable的縮寫,是matlab提供的調用其他語言的子程序的接口
用其它語言編寫的程序經過編譯,可以生成mex文件,作文matlab的擴展函數
MEX庫函數:用於mex程序與matlab環境交換數據和從matlab工作空間獲取相應信息
常用MEX庫函數:
mexCallMATLAB函數:用於調用matlab函數
mexErrMsgTxt函數:用於輸出matlab工作空間獲取運行過程錯誤信息。
mexEvalString函數:用於matlab環境中執行表達式
mexGetVariable函數:用於MEX文件從matlab工作區獲取變量
mex文件源程序的構成
1.入口子程序
默認標識名是mexFunction
入口子程序有四個參數
c++程序與matlab交換數據,須使用mxArray對象
2.計算子程序
包含所有完成計算功能的程序代碼,由入口子程序調用。計算子程序的定義格式如下:
返回值類型 子程序名(輸入形參表)
{
...
}
該mex文件
新建一個c++源程序
判斷兩個數是否互質,函數的返回值為bool型,函數有兩個雙精度型參數
首先定義兩個變量x,y,存儲指針所指對象的值
然后用輾轉相除法求兩個數最大公約數的值
首先將較大值放入x,將小值放入y
然后x除以y得余數tmp,如果余數不為0,將tmp作為新的y,繼續求余數,直到余數為0
若最大公約數為1,說明兩個數互質
然后檢查入口函數,檢查輸入輸出時是否符合要求
調用時,虛參plhs指向z,實參prhs指向y,首先檢查調用mex文件時輸入實參是否有兩個
然后檢查輸入實參是否是一個
然后逐個獲取輸入實參的行數和列數
檢查每一個實參是否為單個的數
如果調用時輸入與輸出實參符合要求,則在matlab工作區建立一個矩陣
矩陣的大小與輸入實參的大小相同
mxGetPr函數獲取實參的地址
如果isCoprime函數為true,返回時,輸出參數為1,否則為0
將編輯好的源程序進行編譯,生成MEX文件
方法:
例如利用matlab編譯器
>>mex MEXDemo.cpp
編譯成功,將生成一個mex文件:MEXDemo.mexw64
.mexw64表示生成的是可以在windows64位系統下運行的文件
調用mex文件的方法和m文件的方法相同
例如判斷11和13互質,判斷15和33不互質
MEX文件源程序由入口子程序和計算子程序構成,入口子程序在c++和matlab之間傳遞數據,
並調用計算子程序
MEX文件源程序生成MEX文件,成為matlab的一個函數
5.在其它語言中調用matlab函數
matlab引擎的概念
在c++程序中通過指向matlab引擎對象的指針操作matlab引擎對象
定義matlab引擎的格式
engOpen,啟動matlab計算引擎,打開一個matlab工作區;starcmd指定打開引擎的方式,在windows系統中只能為空,啟動成功返回引擎句柄,否則返回空
關閉一個matlab工作區,ep是Engine類型的指針
從matlab工作區讀取數據,name指定變量,返回值是指向name的指針
從matlab工作區輸出數據,name指定寫入工作區的變量名
engEvalString執行matlab命令,返回值為0,表示執行成功,1表示執行失敗
matlab引擎的作用
使用matlab引擎需要使用mxArray變量,用來在matlab和其他應用空間交換數據
第一步:創建mxArray變量,(利用mxCreateDoubleMatrix創建m行n列的矩陣,存儲實數)
第二步:給mxArray變量賦值,例如,
第三步:將變量放入到matlab引擎所啟動的工作區中
engine.h,包含了頭文件引擎庫的定義
iostream,包含了輸入輸出流的定義
定義指針,操作引擎對象
mxArray類型的指針用來指向matlab輸入的對象
定義存儲數據的變量
按給定表達式生成數據
建立一個矩陣,其成員用於存放實數數據,賦值給T;將數組t賦值給指針T;
向引擎工作區放入矩陣命名為T
同樣的方法將數組R的內容放入引擎R
放入引擎后,利用polar函數繪制極坐標圖
利用title函數給圖形添加標題
完成數據傳遞和計算后,system讓操作系統暫停該執行,但圖形窗口不關閉,提示是否繼續執行程序,mxDestroyArray釋放占用的內存空間,engClose函數關閉計算引擎
生成可執行程序文件
-client指定生成客戶端程序
engine,計算時加入matlab引擎庫
運行結果