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引擎库
运行结果