null第8章 高级编程技术第8章 高级编程技术本章目标本章目标掌握MATLAB文件处理方法
理解MATLAB应用程序接口的原理
了解结构和元胞这两种复杂数据类型
了解面向对象编程的基本概念主要内容主要内容8.1文件
8.2 应用程序接口8.1文件
8.1文件
文件可分为两类:
文本文件
由字符和与字符的显示格式有关的控制符构成
常见扩展名:“TXT” 、“BAT”、“HTM”
二进制文件
二进制文件为非文本文件
常见扩展名:“COM”、“EXE” 、“BMP” 、“WAV”MATLAB中基本的低级文件I/O指令:MATLAB中基本的低级文件I/O指令:1.打开和关闭文件
fopen、fclose
2.格式读写
fprintf、fscanf、fgetl、fgets
3.非格式读写
fread、fwrite
4.文件定位和状态
feof、fseek、ftell、ferror、frewind8.1.1文件的打开与关闭8.1.1文件的打开与关闭1.fopen函数
fid=fopen(filename,permission)
[fid,message]=fopen(filename,permssion)
[filename,permission,machineformat]=fopen(fid)
fid =fopen('all')
2.fclose函数
status=fclose(fid)
status=fclose('all')
例:打开一个名为std.dat的数据文件并进行读操作,命令为:
fid=fopen('my.txt','r')8.1.2格式化数据的读写8.1.2格式化数据的读写fprintf函数
count=fprintf(fid,format , A ...)
fscanf函数
[A, count]=fscanf(fid, format, size)
例8-1例8-1计算当x=[0 1]时f(x)=ex的值,并将结果写入到文件my.txt中。
程序
x=0:0.1:1;
y=[x;exp(x)]; %y有两行数据
fid=fopen('my.txt','w');
fprintf(fid,'%6.2f %12.8f\n',y);
fclose(fid);例8-2例8-2从上例中生成的文件my.txt中读取数据,并将结果输出到屏幕。
程序
fid = fopen('my.txt','r');
[a,count] = fscanf(fid,'%f %f',[2 inf]); fprintf(1,'%f %f\n',a);
fclose(fid);
输出 同例8-1文件中的数据格式。8.1.3 文件定位和文件状态8.1.3 文件定位和文件状态1.feof函数:检测文件是否已经结束
status=feof(fid)
2.ferror函数:用于查询文件的输入、输出错误信息
msg=ferror(fid)
3.frewind函数:使位置指针重新返回文件的开头
frewind(fid)
4.fseek函数:设置文件的位置指针
status=fseek(fid, offset, origin)
5.ftell函数:用于查询当前文件指针的位置
position=ftell(fid);
例8-3 输出文件的大小。例8-3 输出文件的大小。程序
fid=fopen('my.txt','r');
fseek(fid,0,'eof');
x=ftell(fid);
fprintf(1,'File Size=%d\n',x);
frewind(fid);
x=ftell(fid);
fprintf(1,'File Position =%d\n',x);
fclose(fid);
输出
File Size = 231
File Position = 0
8.1.4按行读取数据8.1.4按行读取数据1.fgetl函数:按行从文件中读取数据,但不读取换行符。
line=fgetl(fid)
2.fgets函数:用于从文件中读取行、保留换行符并把行作为字符串返回。
(1)line=fgets(fid)
(2)line=fgets(fid,nchar) 例8-4例8-4编写一个程序,用于读取例8-1生成的数据。
程序
fid=fopen('my.txt','r');
while ~feof(fid)%在文件没有结束时按行读取数据
s=fgets(fid);
fprintf(1,'%s',s);
end
fclose(fid);
输出 同例8-1文件中的数据格式。8.1.5二进制数据文件的读写8.1.5二进制数据文件的读写fwrite函数:用于向一个文件写入二进制数据
count=fwrite(fid, A, precision)。
fread函数:用于从文件中读二进制数据
[A,count]=fread(fid, size, precision)
注意:使用函数fread()和fwrite()读写文件时,必须以二进制方式打开文件
例8-5例8-5将5行5列“魔方阵”存入二进制文件中。
程序
fid=fopen('my.dat','w');
a=magic(5);
fwrite(fid,a,'long');
fclose(fid);例8-6例8-6从二进制文件中读取“魔方阵”。
程序
fid=fopen('my.dat','r');
[A,count]=fread(fid, [5, inf], 'long');
fclose(fid);
A
8.1.6 图像、声音文件的读写8.1.6 图像、声音文件的读写1.imread函数:从文件中读入图像
A = imread(filename,fmt)
[A, map] = imread(filename,fmt)
2.image函数:显示图像
image(A)
3.imwrite函数:将图像写入文件
imwrite(A, filename, fmt)
imwrite(A, map, filename, fmt)
例8-7例8-7显示一幅真彩(RGB)图像。
程序
[x,map]=imread('C:\MATLAB7\toolbox\matlab\demos\street1.jpg');
image(x);
例8-8 将图像写入文件例8-8 将图像写入文件程序
[x,map]=imread('C:\MATLAB7\toolbox\matlab\demos\street1.jpg');
imwrite(x,'my.bmp'); %将图像保存为真彩色的bmp
[x,map]=imread('my.bmp');
image(x);
8.1.6图像、声音文件的读写8.1.6图像、声音文件的读写4.imfinfo函数:查询图像文件信息
innfo = imflnfo(filename)
5.wavread函数:用于读取扩展名为“.wav”的声音文件
y=wavread(file)
[y, fs, nbits]=wavread(file)
6.wavwrite函数:用于将数据写入到扩展名为“wav”的声音文件中
wavwrite(y, fs, nbits, wavefile)
7.wavplay函数:利用windows音频输出设备播放声音
wavplay(y,fs)例8-9例8-9读取一个音频数据文件,以不同频率播放,并显示声音波形。
程序:
y=wavread('C:\MATLAB7\toolbox\simulink\simdemos\simgeneral\toilet.wav')
plot(y);
wavplay(y);
wavplay(y,11025);
wavplay(y,44100);8.2 应用程序接口 8.2 应用程序接口 MATLAB的外部接口应用包括如下内容:
(1)在MATLAB中调用已有的C/C++语言代码;
(2)在C/C++语言中调用MATLAB的算法;
(3)利用COM标准进行客户/服务器模式开发;
例如在Visual Basic程序或者Microsoft Excel中调用MATLAB的算法
(4)在C/C++语言中读写MAT数据文件。8.2.1 MEX文件8.2.1 MEX文件例8-10 简单MEX文件示例mexHelloWorld.c。
程序:
#include "mex.h"
void mexFunction(int nlhs,mxArray *plhs[],int nrhs,const mxArray *prhs[])
{
mexPrintf("Hello Matlab World!");
}
8.2.2 MATLAB计算引擎8.2.2 MATLAB计算引擎MATLAB的计算引擎应用就是利用MATLAB提供的一组接口函数,在用户开发的C/C++语言应用程序中,通过某种通信机制后台调用MATLAB应用程序以完成复杂的系统任务。 例8-11例8-11设计一程序,在C/C++语言中调用mesh函数来绘制高斯矩阵的曲面。
解
步骤:
例8-11 程序:例8-11 程序:#include
#include "engine.h"
void main()
{
Engine *ep;
int status = 0;
// 打开计算引擎
ep = engOpen(NULL);
if( ep == (Engine *)NULL ){
printf("错误:无法打开MATLAB计算引擎\n" );
exit(-1);
}
// 执行MATLAB指令
engEvalString(ep,"mesh(peaks);");
getchar();
// 关闭MATLAB计算引擎
status = engClose(ep);
if(status != 0){
printf("无法正常关闭MATLAB计算引擎\n");
exit(-1);
}
}
8.2.3基于COM组件的接口编程8.2.3基于COM组件的接口编程该方法的主要特点有:
(1)应用程序完全脱离MATLAB工作环境;
(2)MATLAB数学库和工具箱中包括的各种各样的函数,所以降低了编写算法难度;
(3)由于将算法程序做成了COM组件的形式,所以实现了算法的保密。8.2.4在C/C++语言中读写MAT数据文件8.2.4在C/C++语言中读写MAT数据文件支持C/C++语言读写MAT文件的函数库有下面几个:
1.打开数据文件──matOpen
MATFile * matOpen(const char *filename,const char *mode)
2.关闭数据文件──matClose
int matClose(MATFile *mfp)
3.获取变量──matGetVariable
mxArray *matGetVariable(MATFile *mfp,const char *name)
4.写入数据──matPutVariable
int matPutVariable(MATFile *mfp, const char *name,const mxArray *mp)扩展阅读扩展阅读8.3 结构数组
8.4 元胞数组
8.5 面向对象程序设计应用举例应用举例例8-12 在C/C++语言中调用MATLAB计算魔方阵,并将结果显示到屏幕。程序代码-1程序代码-1#include "engine.h"
#include
void main()
{
Engine *ep;
double *p;
mxArray *equation;
int i = 0,j=0;
int status = 0;
// 打开计算引擎
ep = engOpen(NULL);
if( ep == (Engine *)NULL ){
printf("错误:无法打开MATLAB计算引擎\n" );
exit(-1);
}程序代码-2程序代码-2 // 执行MATLAB指令
engEvalString(ep,"A = magic(5);");
equation=engGetVariable(ep,"A");
p=mxGetPr(equation);
printf("\nMATLAB 中计算magic(5)\n");
for(i=0;i<5;i++)
{
for(j=0;j<5;j++)
printf("%8.0lf",*(p+i+j*5));
printf("\n");
}
// 关闭MATLAB计算引擎
status = engClose(ep);
if(status != 0){
printf("无法正常关闭MATLAB计算引擎\n");
exit(-1);
}
}
例8-13例8-13程序代码-1程序代码-1#include
#include
#include "engine.h"
void main()
{
Engine *ep;
int status = 0;
ep = engOpen(NULL);
// 执行MATLAB指令
double A[]={2, 3, 4, -1, 1, -1, 3, -5, 1},B[]={5,5,9};
double *pa,*pb,*pc;
mxArray *x,*y,*z;程序代码-2程序代码-2 x=mxCreateDoubleMatrix(3,3,mxREAL);
y=mxCreateDoubleMatrix(3,1,mxREAL);
pa=mxGetPr(x);
pb=mxGetPr(y);
memcpy(pa,A,9*sizeof(double));
memcpy(pb,B,3*sizeof(double));
engPutVariable(ep,"A",x);
engPutVariable(ep,"B",y);
engEvalString(ep,"C=A\\B;");
z=engGetVariable(ep,"C");
pc=mxGetPr(z);
printf("\nAX=B的结果为:\n");
for(int i=0;i<3;i++)
{
printf("%8.0lf\n",*(pc+i));
}
status = engClose(ep);
}结 束 语结 束 语学好计算机的唯一途径是
你的编程能力与你在计算机上投入的时间成