搜档网
当前位置:搜档网 › 第11章_MATLAB外部程序接口技术_例题源程序

第11章_MATLAB外部程序接口技术_例题源程序

第11章_MATLAB外部程序接口技术_例题源程序
第11章_MATLAB外部程序接口技术_例题源程序

第11章MATLAB外部程序接口技术

例11.1 假定文件textdemo.txt中有以下格式的数据:

[names, x, y, z] = textread ('textdemo.txt', '%s %d %d %d', 4, 'headerlines', 1);

例11.2计算当x=[0.0,0.1,0.2,…,1.0]时,f(x)=e x的值,并将结果写入文件demo1.txt。

x=[0:0,1:1];

y=[x;exp(x)];

fid=fopen(?demo1.txt?,?w?);

fprintf(fid,?%6.2f %12.8f\n?,y);

fclose(fid);

例11.3将十进制数转换为十六进制数。

A=[6,10,14,44];

fprintf(…%9X\n?, A+ (A<0)*2^32)

例11.4读出例11.2生成的文件demo1.txt中的数据。

fid=fopen('demo1.txt','r');

while 1

LINE=fgetl(fid);

if LINE<0 break, end;

disp (LINE);

end

fclose(fid);

例11.5将例11.1的文件读入到grades中。

fid = fopen('textdemo.txt', 'r');

grades = textscan(fid, '%s %d %d %d', 3, 'headerlines', 1);

grades{:}

例11.6假设文件alphabet.txt的内容是按顺序排列的26个大写英文字母,读取前5个字母的ASCII码和这5个字符。

fid = fopen('alphabet.txt', 'r');

c = fread(fid, 5);

frewind(fid);

d = fread(fid, 5, '*char');

fclose(fid);

例11.7建立一数据文件magic5.dat,用于存放5阶魔方阵。

fid=fopen('magic5.dat','w');

cnt=fwrite(fid,magic(5),'int32');

fclose(fid);

例11.8下列程序执行后,变量four、position和three的值是多少?

a=1:5;

fid=fopen('fdat.bin','w'); %以写方式打开文件fdat.bin

fwrite(fid,a,'int16'); %将a的元素以双字节整型写入文件fdat.bin

status=fclose(fid);

fid=fopen('fdat.bin','r'); %以读数据方式打开文件fdat.bin

status=fseek(fid,6,'bof'); %将文件指针从开始位置向尾部移动6个字节

four=fread(fid,1,'int16'); %读取第4个数据,并移动指针到下一个数据

position=ftell(fid); %ftell的返回值为8

status=fseek(fid,-4,'cof'); %将文件指针从当前位置往前移动4个字节

three=fread(fid,1,'int16'); %读取第3个数据

status=fclose(fid);

例11.9创建MAT文件。

#include

#include /* For strcmp() */

#include /* For EXIT_FAILURE, EXIT_SUCCESS */

#include "mat.h"

#define BUFSIZE 256

int main() {

MATFile *pmat; /*定义MAT文件指针*/

mxArray *pa1, *pa2, *pa3;

double data[9] = { 1.0, 4.0, 7.0, 2.0, 5.0, 8.0, 3.0, 6.0, 9.0 };

const char *file = "mattest.mat";

char str[BUFSIZE];

int status;

/*打开一个MAT文件,如果不存在则创建一个MAT文件,如果打开失败,则返回*/

printf("Creating file %s...\n\n", file);

pmat = matOpen(file, "w");

if (pmat == NULL) {

printf("Error creating file %s\n", file);

printf("(Do you have write permission in this directory?)\n");

return(EXIT_FAILURE);

}

/*创建三个mxArray结构体对象,其中pa1、pa2分别为3×3、2×2的双精度实型矩阵*/

/*pa3为字符串类型的阵列,如果创建失败则返回*/

pa1 = mxCreateDoubleMatrix(3,3,mxREAL);

if (pa1 == NULL) {

printf("%s : Out of memory on line %d\n", __FILE__, __LINE__);

printf("Unable to create mxArray.\n");

return(EXIT_FAILURE); }

pa2 = mxCreateDoubleMatrix(3,3,mxREAL);

if (pa2 == NULL) {

printf("%s : Out of memory on line %d\n", __FILE__, __LINE__);

printf("Unable to create mxArray.\n");

return(EXIT_FAILURE); }

memcpy((void *)(mxGetPr(pa2)), (void *)data, sizeof(data));

pa3 = mxCreateString("MATLAB: the language of technical computing");

if (pa3 == NULL) {

printf("%s : Out of memory on line %d\n", __FILE__, __LINE__);

printf("Unable to create string mxArray.\n");

return(EXIT_FAILURE); }

/*向MAT文件中写数据,失败则返回*/

status = matPutVariable(pmat, "LocalDouble", pa1);

if (status != 0) {

printf("%s : Error using matPutVariable on line %d\n", &

__FILE__, __LINE__);

return(EXIT_FAILURE); }

status = matPutVariableAsGlobal(pmat, "GlobalDouble", pa2);

if (status != 0) {

printf("Error using matPutVariableAsGlobal\n");

return(EXIT_FAILURE); }

status = matPutVariable(pmat, "LocalString", pa3);

if (status != 0) {

printf("%s : Error using matPutVariable on line %d\n", &

__FILE__, __LINE__);

return(EXIT_FAILURE); }

/*清除矩阵*/

mxDestroyArray(pa1);

mxDestroyArray(pa2);

mxDestroyArray(pa3);

/* 关闭MAT文件*/

if (matClose(pmat) != 0) {

printf("Error closing file %s\n",file);

return(EXIT_FAILURE); }

printf("Done\n");

return(EXIT_SUCCESS);

}

3.FORTRAN语言MAT文件应用

(1) 常用MAT文件操作函数

常用FORTRAN语言MAT函数有:

Integer*4 function matOpen(filename,mode)

Integer*4 function matClose(mfp)

Integer*4 function matDeleteVariable(mfp, name)

Integer*4 function matGetDir(mfp,num)

Integer*4 function matGetVariable(mfp, name)

Integer*4 function matPutVariable(mfp, name, pm)

Integer*4 function matPutVariableAsGlobal(mfp, name, pm)

其中mfp为指向MAT文件的指针,name是读取或写入MAT文件的矩阵名称;num为MAT文件中矩阵的数目,pm是mxArray结构体的指针,mode为打开文件的方式。

(2) 应用示例

例11.10读取例11.9产生的MAT文件。

integer matOpen, matGetDir, matGetVariable

integer mp, dir, adir(100), pa

integer mxGetM, mxGetN, matClose

integer ndir, i, stat

character*32 names(100)

mp = matOpen('mattest.mat', 'r')

if (mp .eq. 0) then

write(6,*) 'Can''t open ''mattest.mat''.'

stop

end if

! 读取目录

dir = matgetdir(mp, ndir)

if (dir .eq. 0) then

write(6,*) 'Can''t read directory.'

stop

endif

call mxCopyPtrToPtrArray(dir, adir, ndir)

do i=1,ndir

call mxCopyPtrToCharacter(adir(i), names(i), 32)

end do

write(6,*) 'Directory of Mat-file:'

do i=1, ndir

write(6,*) names(i)

end do

!读取矩阵

write(6,*) 'Getting array contents:'

do n=1,ndir

pa = matGetVariable(mp, names(n))

write(6,*) 'Retrieved ', names(n)

write(6,*) ' With size ', mxGetM(pa), '-by-', mxGetN(pa)

call mxDestroyArray(pa)

end do

stat = matClose(mp)

if (stat .ne. 0) then

write(6,*) 'Error closing ''mattest.mat''.'

end if

end

例11.11创建一个矩阵,然后送到MATLAB计算引擎的工作区中,绘制出结果图。

#include

#include

#include

#include "engine.h"

#define BUFSIZE 256

int main()

{

Engine *ep; //定义MATLAB引擎变量

mxArray *T = NULL, *result = NULL;

double time[10] = { 0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0 };

/*启动MATLAB计算引擎。若在本地启动,那么函数所带的参数字符串为空*/

/*若在网络中启动,则需要提供服务器名,即engOpen(“服务器名”)*/

if (!(ep = engOpen("\0")))

{

fprintf(stderr, "\nCan't start MATLAB engine\n");

return EXIT_FAILURE;

}

/*向新启动的MATLAB工作区放置数据*/

T = mxCreateDoubleMatrix(1, 10, mxREAL);

memcpy((void *)mxGetPr(T), (void *)time, sizeof(time));

engPutVariable(ep, "T", T);

/*执行MATLAB命令*/

engEvalString(ep, "D = .5.*(-9.8).*T.^2;");

engEvalString(ep, "plot(T,D);");

engEvalString(ep, "title('Position vs. Time for a falling object');");

engEvalString(ep, "xlabel('Time (seconds)');");

engEvalString(ep, "ylabel('Position (meters)');");

/*从MATLAB工作区获取计算结果*/

result = engGetVariable(ep,"D");

printf("The size of result is %d*%d\t\n",mxGetM(result),mxGetN(result));

printf("Hit return to continue\n\n");

fgetc(stdin);

printf("Done!\n");

/*释放内存空间,关闭计算引擎*/

mxDestroyArray(T);

engEvalString(ep, "close;");

engClose(ep);

return EXIT_SUCCESS;

}

例11.12在FORTRAN源程序中调用MATLAB 引擎绘制多峰函数矩阵。

integer engEvalString, engClose, engOpen

integer ep, status

ep = engOpen('matlab')

if ( ep==0) then

write(6,*) 'Can''t start MATLAB engine'

stop

endif

status = engEvalString(ep,'mesh(peaks);')

pause

if (engclose(ep)/=0) then

write(6,*) 'Can''t close MATLAB engine'

endif

end

例11.13一个MATLAB自带的C语言MEX文件的编辑执行。

#include "mex.h"

void timestwo(double y[], double x[])

{

y[0] = 2.0*x[0];

}

void mexFunction( int nlhs, mxArray *plhs[],

int nrhs, const mxArray *prhs[] )

{

double *x,*y;

int mrows,ncols;

/*检查正确的参数数目*/

if(nrhs!=1) {

mexErrMsgTxt("One input required.");

} else if(nlhs>1) {

mexErrMsgTxt("Too many output arguments");

}

/*输入变量必须是非复数类型的标量*/

mrows = mxGetM(prhs[0]);

ncols = mxGetN(prhs[0]);

if( !mxIsDouble(prhs[0]) || mxIsComplex(prhs[0]) ||

!(mrows==1 && ncols==1) ) {

mexErrMsgTxt("Input must be a noncomplex scalar double.");

}

/*为返回参数创建矩阵*/

plhs[0] = mxCreateDoubleMatrix(mrows,ncols, mxREAL);

/*分配输入输出参数的指针*/

x = mxGetPr(prhs[0]);

y = mxGetPr(plhs[0]);

/*调用timestwo子例程*/

timestwo(y,x);

}

例11.14将例11.13用FORTRAN 90实现。

subroutine mexFunction(nlhs, plhs, nrhs, prhs)

integer plhs(*), prhs(*)

integer mxGetPr, mxCreateDoubleMatrix integer nlhs, nrhs

integer mxGetM, mxGetN, mxIsNumeric integer m, n, x, y

!检查输入、输出的参数个数

if(nrhs .ne. 1.or. nlhs .ne. 1) then

call mexErrMsgTxt('One input required.') endif

!获得输入矩阵的大小

m = mxGetM(prhs(1))

n = mxGetN(prhs(1))

!检查输入数据的类型是否为数值

if(mxIsNumeric(prhs(1)) .eq. 0) then

call mexErrMsgTxt('Input must be a number.') endif

!创建输出矩阵

plhs(1) = mxCreateDoubleMatrix(m,n,0)

!调用计算子例程

x = mxGetPr(prhs(1))

y = mxGetPr(plhs(1))

call timestwo(%VAL(y), %VAL(x))

!将数据送往MATLAB工作空间

return

end

subroutine timestwo(y, x)

real*8 x, y

y = 2.0 * x

return

end

matlab源代码实例

1.硬币模拟试验 源代码: clear; clc; head_count=0; p1_hist= [0]; p2_hist= [0]; n = 1000; p1 = 0.3; p2=0.03; head = figure(1); rand('seed',sum(100*clock)); fori = 1:n tmp = rand(1); if(tmp<= p1) head_count = head_count + 1; end p1_hist (i) = head_count /i; end figure(head); subplot(2,1,1); plot(p1_hist); grid on; hold on; xlabel('重复试验次数'); ylabel('正面向上的比率'); title('p=0.3试验次数N与正面向上比率的函数图'); head_count=0; fori = 1:n tmp = rand(1); if(tmp<= p2) head_count = head_count + 1; end p2_hist (i) = head_count /i; end figure(head); subplot(2,1,2); plot(p2_hist); grid on; hold on; xlabel('重复试验次数'); ylabel('正面向上的比率'); title('p=0.03试验次数N与正面向上比率的函数图'); 实验结果:

2.不同次数的随机试验均值方差比较 源代码: clear ; clc; close; rand('seed',sum(100*clock)); Titles = ['n=5时' 'n=20时' 'n=25时' 'n=50时' 'n=100时']; Titlestr = cellstr(Titles); X_n_bar=[0]; %the samples of the X_n_bar X_n=[0]; %the samples of X_n N=[5,10,25,50,100]; j=1; num_X_n = 100; num_X_n_bar = 100; h_X_n_bar = figure(1);

第8章 微机原理习题库

一.填空题 1.类型码为()的中断所对应的中断向量存放在0000H:0058H开始的4个连续单元中,若这4个单元的内容分别为(),则相应的中断服务程序入口地址为5060H:7080H。 2.CPU在指令的最后一个时钟周期检测INTR引脚,若测得INTR为()且IF为(),则CPU在结束当前指令后响应中断请求。 3.从CPU的NMI引脚产生的中断叫做(),它的响应不受()的影响。 4.中断类型码为15H的中断,其服务程序的入口地址一定存放在()四个连续的单元中,若这四个单元的的内容为:66H、50H、88H、30H,则其服务程序的入口地址为()。5.中断控制器8259A中的中断屏蔽寄存器IMR的作用是()。 6.CPU响应可屏蔽中断的条件是()、()和()。 7.在8086/8088微机系统中,INT20H指令中断向量存放在()中。 8.CPU在响应中断时,首先是保护(),然后将中断服务程序入口地址送入()。9.在8086/8088微机中,实现CPU关中断的指令是(),实现开中断的指令是()。10.如果CPU同时接收到中断请求和总线请求,则CPU应先响应()。 11.当用8259A管理INTR中断时,要发出EOI命令结束中断是操作()命令字。12.执行INTn指令时,其中断类型号由()提供,响应INTR时,中断类型号由()提供,响应NMI时,中断类型号由()提供,执行BOUND指令时,中断类型号由( )提供。 13.INTR、NMI均属于外中断,其中INTR被称为()中断,NMI被称为()中断。 14.80486在实模式下,当某中断源的中断类型码为70H时,中断服务程序的偏移地址和段基址将分别填入()单元和()单元。 15.CUP复位时,由于()被清零,使从INTR输入的可屏蔽中断不被响应。 16.2片8259A级联可管理()个可屏蔽中断。 17.INTR输入是()有效。 18.级连系统中,从8259A中的INT引脚应与主8259A的()连接。 19.()时,使用8259A的CS2~CS0引脚。 20.用二片8259A级连后,CPU的可屏蔽方式硬中断可扩充到()级。

一个简单的Matlab_GUI编程实例

Matlab GUI编程教程(适用于初学者) 1.首先我们新建一个GUI文件:如下图所示; 选择Blank GUI(Default) 2.进入GUI开发环境以后添加两个编辑文本框,6个静态文本框,和一个按钮,布置如下

图所示; 布置好各控件以后,我们就可以来为这些控件编写程序来实现两数相加的功能了。3.我们先为数据1文本框添加代码; 点击上图所示红色方框,选择edit1_Callback,光标便立刻移到下面这段代码的位置。 1. 2. 3.function edit1_Callback(hObject, eventdata, handles) 4.% hObject handle to edit1 (see GCBO) 5.% eventdata reserved - to be defined in a future version of MATLAB

6.% handles structure with handles and user data (see GUIDATA) 7.% Hints: get(hObject,'String') returns contents of edit1 as text 8.% str2double(get(hObject,'String')) returns contents of edit1 as a double 复制代码 然后在上面这段代码的下面插入如下代码: 1. 2.%以字符串的形式来存储数据文本框1的内容. 如果字符串不是数字,则现实空白内容input = str2num(get(hObject,'String')); %检查输入是否为空. 如果为空,则默认显示为0if (isempty(input)) set(hObject,'String','0')endguidata(hObject, handles); 复制代码 这段代码使得输入被严格限制,我们不能试图输入一个非数字。 4.为edit2_Callback添加同样一段代码 5 现在我们为计算按钮添加代码来实现把数据1和数据2相加的目的。 用3中同样的方法在m文件中找到pushbutton1_Callback代码段 如下; 1.function pushbutton1_Callback(hObject, eventdata, handles) 2.% hObject handle to pushbutton1 (see GCBO) 3.% eventdata reserved - to be defined in a future version of MATLAB 4.% handles structure with handles and user data (see GUIDATA) 复制代码

matlab语音识别系统(源代码)最新版

matlab语音识别系统(源代码)最新版

目录 一、设计任务及要求 (1) 二、语音识别的简单介绍 2.1语者识别的概念 (2) 2.2特征参数的提取 (3) 2.3用矢量量化聚类法生成码本 (3) 2.4VQ的说话人识别 (4) 三、算法程序分析 3.1函数关系 (4) 3.2代码说明 (5) 3.2.1函数mfcc (5) 3.2.2函数disteu (5) 3.2.3函数vqlbg (6) 3.2.4函数test (6) 3.2.5函数testDB (7) 3.2.6 函数train (8) 3.2.7函数melfb (8) 四、演示分析 (9) 五、心得体会 (11) 附:GUI程序代码 (12)

一、设计任务及要求 用MATLAB实现简单的语音识别功能; 具体设计要求如下: 用MATLAB实现简单的数字1~9的语音识别功能。 二、语音识别的简单介绍 基于VQ的说话人识别系统,矢量量化起着双重作用。在训练阶段,把每一个说话者所提取的特征参数进行分类,产生不同码字所组成的码本。在识别(匹配)阶段,我们用VQ方法计算平均失真测度(本系统在计算距离d时,采用欧氏距离测度),从而判断说话人是谁。 语音识别系统结构框图如图1所示。 图1 语音识别系统结构框图 2.1语者识别的概念 语者识别就是根据说话人的语音信号来判别说话人的身份。语音是人的自然属性之一,由于说话人发音器官的生理差异以及后天形成的行为差异,每个人的语音都带有强烈的个人色彩,这就使得通过分析语音信号来识别说话人成为可能。用语音来鉴别说话人的身份有着许多独特的优点,如语音是人的固有的特征,不会丢失或遗忘;语音信号的采集方便,系统设备成本低;利用电话网络还可实现远程客户服务等。因此,近几年来,说话人识别越来越多的受到人们的重视。与其他生物识别技术如指纹识别、手形识别等相比较,说话人识别不仅使用方便,而且属于非接触性,容易被用户接受,并且在已有的各种生物特征识别技术中,是唯一可以用作远程验证的识别技术。因此,说话人识别的应用前景非常广泛:今天,说话人识别技术已经关系到多学科的研究领域,不同领域中的进步都对说话人识别的发展做出了贡献。说话人识别技术是集声学、语言学、计算机、信息处理和人工智能等诸多领域的一项综合技术,应用需求将十分广阔。在吃力语音信号的时候如何提取信号中关键的成分尤为重要。语音信号的特征参数的好坏直接导致了辨别的准确性。

数字信号处理Matlab实现实例(推荐给学生)

数字信号处理Matlab 实现实例 第1章离散时间信号与系统 例1-1 用MATLAB计算序列{-2 0 1 –1 3}和序列{1 2 0 -1}的离散卷积。 解 MATLAB程序如下: a=[-2 0 1 -1 3]; b=[1 2 0 -1]; c=conv(a,b); M=length(c)-1; n=0:1:M; stem(n,c); xlabel('n'); ylabel('幅度'); 图1.1给出了卷积结果的图形,求得的结果存放在数组c中为:{-2 -4 1 3 1 5 1 -3}。 例1-2 用MATLAB计算差分方程 当输入序列为时的输出结果。 解 MATLAB程序如下: N=41; a=[0.8 -0.44 0.36 0.22]; b=[1 0.7 -0.45 -0.6]; x=[1 zeros(1,N-1)];

k=0:1:N-1; y=filter(a,b,x); stem(k,y) xlabel('n');ylabel('幅度') 图 1.2 给出了该差分方程的前41个样点的输出,即该系统的单位脉冲响应。 例1-3 用MATLAB 计算例1-2差分方程 所对应的系统函数的DTFT 。 解 例1-2差分方程所对应的系统函数为: 123 123 0.80.440.360.02()10.70.450.6z z z H z z z z -------++= +-- 其DTFT 为 23230.80.440.360.02()10.70.450.6j j j j j j j e e e H e e e e ωωωω ωωω--------++= +-- 用MATLAB 计算的程序如下: k=256; num=[0.8 -0.44 0.36 0.02]; den=[1 0.7 -0.45 -0.6]; w=0:pi/k:pi; h=freqz(num,den,w); subplot(2,2,1); plot(w/pi,real(h));grid title('实部') xlabel('\omega/\pi');ylabel('幅度')

基于MATLAB的潮流计算源程序代码(优.选)

%*************************电力系统直角坐标系下的牛顿拉夫逊法潮流计算********** clear clc load E:\data\IEEE014_Node.txt Node=IEEE014_Node; weishu=size(Node); nnum=weishu(1,1); %节点总数 load E:\data\IEEE014_Branch.txt branch=IEEE014_Branch; bwei=size(branch); bnum=bwei(1,1); %支路总数 Y=(zeros(nnum)); Sj=100; %********************************节点导纳矩阵******************************* for m=1:bnum; s=branch(m,1); %首节点 e=branch(m,2); %末节点 R=branch(m,3); %支路电阻 X=branch(m,4); %支路电抗 B=branch(m,5); %支路对地电纳 k=branch(m,6); if k==0 %无变压器支路情形 Y(s,e)=-1/(R+j*X); %互导纳 Y(e,s)=Y(s,e); end if k~=0 %有变压器支路情形 Y(s,e)=-(1/((R+j*X)*k)); Y(e,s)=Y(s,e); Y(s,s)=-(1-k)/((R+j*X)*k^2); Y(e,e)=-(k-1)/((R+j*X)*k); %对地导纳 end Y(s,s)=Y(s,s)-j*B/2; Y(e,e)=Y(e,e)-j*B/2; %自导纳的计算情形 end for t=1:nnum; Y(t,t)=-sum(Y(t,:))+Node(t,12)+j*Node(t,13); %求支路自导纳 end G=real(Y); %电导 B=imag(Y); %电纳 %******************节点分类************************************* * pq=0; pv=0; blancenode=0; pqnode=zeros(1,nnum); pvnode=zeros(1,nnum); for m=1:nnum; if Node(m,2)==3 blancenode=m; %平衡节点编号 else if Node(m,2)==0 pq=pq+1; pqnode(1,pq)=m; %PQ 节点编号 else if Node(m,2)==2 pv=pv+1; pvnode(1,pv)=m; %PV 节点编号 end end end end %*****************************设置电压初值********************************** Uoriginal=zeros(1,nnum); %对各节点电压矩阵初始化 for n=1:nnum Uoriginal(1,n)=Node(n,9); %对各点电压赋初值 if Node(n,9)==0;

c语言程序设计-向艳-书上例题源代码教学提纲

第五章函数 1.定义一个求两个整数和的函数 int sum(x,y) int x,y; { int z; z=x+y; return(z); } 2.编写函数求两个数的最大值 #include float max(float x,float y) { float z; if(x>y) z=x; else z=y; return (z); } void main() { float a,b,c; scanf("%f%f",&a,&b); c=max(a,b); printf("max=&f\n",c); } 3.计算并输出一个圆台两底面积之和 #include float area(float x,float y) { float s; s=3.1415*(x*x+y*y); return s; } void printstar() { int i; for(i=0;i<30;i++) printf("*"); printf("\n"); } void main() {

float r1,r2,s; printstar(); scanf("%f,%f",&r1,&r2); s=area(r1,r2); printf("s=%.2f\n",s); printstar(); } 4.实参求值顺序的例子 #include int fun(int a,int b) { if (a>b) return 1; else if (a==b) return 0; else return -1; } void main() { int k=3,s; s=fun(k,++k); printf("s=%d\n",s); } 5.计算Σn i=1 i #include void main() { void s(int); int n; printf("input number\n"); scanf("%d",&n); s(n); printf("n=%d\n",n); } void s(int n) { int i; for(i=n-1;i>=1;i--) n=n+i; printf("n=%d\n",n); } 6.全局变量被“屏蔽” #include

第06章_MATLAB数值计算_例题源程序汇总

第6章 MATLAB 数值计算 例6.1 求矩阵A 的每行及每列的最大和最小元素,并求整个矩阵的最大和最小元素。 1356 78256323578255631 01-???? -? ?=???? -??A A=[13,-56,78;25,63,-235;78,25,563;1,0,-1]; max(A,[],2) %求每行最大元素 min(A,[],2) %求每行最小元素 max(A) %求每列最大元素 min(A) %求每列最小元素 max(max(A)) %求整个矩阵的最大元素。也可使用命令:max(A(:)) min(min(A)) %求整个矩阵的最小元素。也可使用命令:min(A(:)) 例6.2 求矩阵A 的每行元素的乘积和全部元素的乘积。 A=[1,2,3,4;5,6,7,8;9,10,11,12]; S=prod(A,2) prod(S) %求A 的全部元素的乘积。也可以使用命令prod(A(:)) 例6.3 求向量X =(1!,2!,3!,…,10!)。 X=cumprod(1:10) 例6.4 对二维矩阵x ,从不同维方向求出其标准方差。 x=[4,5,6;1,4,8] %产生一个二维矩阵x y1=std(x,0,1) y2=std(x,1,1) y3=std(x,0,2) y4=std(x,1,2) 例6.5 生成满足正态分布的10000×5随机矩阵,然后求各列元素的均值和标准方差,再求这5列随机数据的相关系数矩阵。 X=randn(10000,5); M=mean(X) D=std(X) R=corrcoef(X)

例6.6 对下列矩阵做各种排序。 185412613713-?? ??=?? ??-?? A A=[1,-8,5;4,12,6;13,7,-13]; sort(A) %对A 的每列按升序排序 -sort(-A,2) %对A 的每行按降序排序 [X,I]=sort(A) %对A 按列排序,并将每个元素所在行号送矩阵I 例6.7 给出概率积分 2 (d x x f x x -? e 的数据表如表6.1所示,用不同的插值方法计算f (0.472)。 x=0.46:0.01:0.49; %给出x ,f(x) f=[0.4846555,0.4937542,0.5027498,0.5116683]; format long interp1(x,f,0.472) %用默认方法,即线性插值方法计算f(x) interp1(x,f,0.472,'nearest') %用最近点插值方法计算f(x) interp1(x,f,0.472,'spline') %用3次样条插值方法计算f(x) interp1(x,f,0.472,'cubic') %用3次多项式插值方法计算f(x) format short 例6.8 某检测参数f 随时间t 的采样结果如表6.2,用数据插值法计算t =2,7,12,17,22,17,32,37,42,47,52,57时的f 值。 T=0:5:65; X=2:5:57;

最常用的matlab图像处理的源代码

最常用的一些图像处理Matlab源代 码 #1:数字图像矩阵数据的显示及其傅立叶变换 #2:二维离散余弦变换的图像压缩 #3:采用灰度变换的方法增强图像的对比度 #4:直方图均匀化 #5:模拟图像受高斯白噪声和椒盐噪声的影响 #6:采用二维中值滤波函数medfilt2对受椒盐噪声干扰的图像滤波 #7:采用MATLAB中的函数filter2对受噪声干扰的图像进行均值滤波 #8:图像的自适应魏纳滤波 #9:运用5种不同的梯度增强法进行图像锐化 #10:图像的高通滤波和掩模处理 #11:利用巴特沃斯(Butterworth)低通滤波器对受噪声干扰的图像进行平滑处理 #12:利用巴特沃斯(Butterworth)高通滤波器对受噪声干扰的图像进行平滑处理 1.数字图像矩阵数据的显示及其傅立叶变换 f=zeros(30,30); f(5:24,13:17)=1; imshow(f, 'notruesize'); F=fft2(f,256,256); % 快速傅立叶变换算法只能处矩阵维数为2的幂次,f矩阵不 % 是,通过对f矩阵进行零填充来调整 F2=fftshift(F); % 一般在计算图形函数的傅立叶变换时,坐标原点在 % 函数图形的中心位置处,而计算机在对图像执行傅立叶变换 % 时是以图像的左上角为坐标原点。所以使用函数fftshift进 %行修正,使变换后的直流分量位于图形的中心; figure,imshow(log(abs(F2)),[-1 5],'notruesize');

2 二维离散余弦变换的图像压缩I=imread('cameraman.tif'); % MATLAB自带的图像imshow(I); clear;close all I=imread('cameraman.tif'); imshow(I); I=im2double(I); T=dctmtx(8); B=blkproc(I,[8 8], 'P1*x*P2',T,T'); Mask=[1 1 1 1 0 0 0 0 1 1 1 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]; B2=blkproc(B,[8 8],'P1.*x',Mask); % 此处为点乘(.*) I2=blkproc(B2,[8 8], 'P1*x*P2',T',T); figure,imshow(I2); % 重建后的图像 3.采用灰度变换的方法增强图像的对比度I=imread('rice.tif'); imshow(I); figure,imhist(I); J=imadjust(I,[0.15 0.9], [0 1]); figure,imshow(J); figure,imhist(J);

第2章例题源程序

例2.1 计算表达式 i 27147cos 5-++? 的值,并将结果赋给变量x ,然 后显示出结果。 x=(5+cos(47*pi/180))/(1+sqrt(7)-2*i) %计算表达式的值 例2.2 利用M 文件建立MYMAT 矩阵。 (1)启动有关编辑程序或MATLAB 文本编辑器(见第4章),并输 入待建矩阵: MYMAT=[101,102,103,104,105,106,107,108,109 ; 201,202,203,204,205,206,207,208,209; 301,302,303,304,305,306,307,308,309]; (2)把输入的内容存盘(设文件名为mymatrix.m)。 (3)在MATLAB 命令窗口中输入mymatrix ,即运行该M 文件,就会自动建立一个名为MYMAT 的矩阵,可供以后使用。 例2.3 建立5阶方阵A ,判断A 的元素是否能被3整除。 A =[24,35,13,22,63;23,39,47,80,80; ... 90,41,80,29,10;45,57,85,62,21;37,19,3 1,88,76] P=rem(A,3)==0 %判断A 的元素是否可以被3整 除 例2.4 在[0,3π]区间,求y=sin(x)的值。要求: (1)消去负半波,即(π,2π)区间内的函数值置0。

2 (2) (3π,32π)和(37π,38π)区间内取值均为sin 3 π。 方法1: x=0:pi/100:3*pi; y=sin(x); y1=(x2*pi).*y; %消去负半波 q=(x>pi/3&x<2*pi/3)|(x>7*pi/3&x<8*pi/3); qn=~q; y2=q*sin(pi/3)+qn.*y1; %按要求处理第 (2)步 方法2: x=0:pi/100:3*pi; y=sin(x); y1=(y>=0).*y; %消去负半波 p=sin(pi/3); y2=(y>=p)*p+(y=10 & A<=20) ans = 3 6 7 例2.6 建立一个字符串向量,然后对该向量做如下处理:

BP神经网络matlab源程序代码

close all clear echo on clc % NEWFF——生成一个新的前向神经网络 % TRAIN——对 BP 神经网络进行训练 % SIM——对 BP 神经网络进行仿真 % 定义训练样本 % P为输入矢量 P=[0.7317 0.6790 0.5710 0.5673 0.5948;0.6790 0.5710 0.5673 0.5948 0.6292; ... 0.5710 0.5673 0.5948 0.6292 0.6488;0.5673 0.5948 0.6292 0.6488 0.6130; ... 0.5948 0.6292 0.6488 0.6130 0.5654; 0.6292 0.6488 0.6130 0.5654 0.5567; ... 0.6488 0.6130 0.5654 0.5567 0.5673;0.6130 0.5654 0.5567 0.5673 0.5976; ... 0.5654 0.5567 0.5673 0.5976 0.6269;0.5567 0.5673 0.5976 0.6269 0.6274; ... 0.5673 0.5976 0.6269 0.6274 0.6301;0.5976 0.6269 0.6274 0.6301 0.5803; ... 0.6269 0.6274 0.6301 0.5803 0.6668;0.6274 0.6301 0.5803 0.6668 0.6896; ... 0.6301 0.5803 0.6668 0.6896 0.7497]; % T为目标矢量 T=[0.6292 0.6488 0.6130 0.5654 0.5567 0.5673 0.5976 ... 0.6269 0.6274 0.6301 0.5803 0.6668 0.6896 0.7497 0.8094]; % Ptest为测试输入矢量 Ptest=[0.5803 0.6668 0.6896 0.7497 0.8094;0.6668 0.6896 0.7497 0.8094 0.8722; ... 0.6896 0.7497 0.8094 0.8722 0.9096]; % Ttest为测试目标矢量 Ttest=[0.8722 0.9096 1.0000]; % 创建一个新的前向神经网络 net=newff(minmax(P'),[12,1],{'logsig','purelin'},'traingdm'); % 设置训练参数 net.trainParam.show = 50; net.trainParam.lr = 0.05; net.trainParam.mc = 0.9; net.trainParam.epochs = 5000; net.trainParam.goal = 0.001; % 调用TRAINGDM算法训练 BP 网络 [net,tr]=train(net,P',T); % 对BP网络进行仿真 A=sim(net,P'); figure; plot((1993:2007),T,'-*',(1993:2007),A,'-o'); title('网络的实际输出和仿真输出结果,*为真实值,o为预测值'); xlabel('年份'); ylabel('客运量'); % 对BP网络进行测试 A1=sim(net,Ptest');

Matlab源程序代码

正弦波的源程序: (一),用到的函数 1,f2t函数 function x=f2t(X) global dt df t f T N %x=f2t(X) %x为时域的取样值矢量 %X为x的傅氏变换 %X与x长度相同并为2的整幂 %本函数需要一个全局变量dt(时域取样间隔) X=[X(N/2+1:N),X(1:N/2)]; x=ifft(X)/dt; end 2,t2f函数。 function X=t2f(x) global dt df N t f T %X=t2f(x) %x为时域的取样值矢量 %X为x的傅氏变换 %X与x长度相同,并为2的整幂。 %本函数需要一个全局变量dt(时域取样间隔) H=fft(x); X=[H(N/2+1:N),H(1:N/2)]*dt; end (二),主程序。 1,%(1)绘出正弦信号波形及频谱 global dt df t f N close all k=input('取样点数=2^k, k取10左右'); if isempty(k), k=10; end f0=input('f0=取1(kz)左右'); if isempty(f0), f0=1; end N=2^k; dt=0.01; %ms df=1/(N*dt); %KHz T=N*dt; %截短时间

Bs=N*df/2; %系统带宽 f=[-Bs+df/2:df:Bs]; %频域横坐标 t=[-T/2+dt/2:dt:T/2]; %时域横坐标 s=sin(2*pi*f0*t); %输入的正弦信号 S=t2f(s); %S是s的傅氏变换 a=f2t(S); %a是S的傅氏反变换 a=real(a); as=abs(S); subplot(2,1,1) %输出的频谱 plot(f,as,'b'); grid axis([-2*f0,+2*f0,min(as),max(as)]) xlabel('f (KHz)') ylabel('|S(f)| (V/KHz)') %figure(2) subplot(2,1,2) plot(t,a,'black') %输出信号波形画图grid axis([-2/f0,+2/f0,-1.5,1.5]) xlabel('t(ms)') ylabel('a(t)(V)') gtext('频谱图') 最佳基带系统的源程序: (一),用到的函数 f2t函数和t2f函数。代码>> (二),主程序 globaldt t f df N T close all clear Eb_N0 Pe k=input('取样点数=2^k, k取13左右'); if isempty(k), k=13; end z=input('每个信号取样点数=2^z, z

第十章 输入输出系统习题

第十章输入输出系统习题 一、单项选择题: 1、“总线忙”信号是由__ __建立的。 A.获得总线控制权的设备B.发出“总线请求”的设备 C.总线控制器D.CPU 2、在不同速度的设备之间传送数据__ __。 A.必须采用同步控制方式B.必须采用异步控制方式 C.可以选用同步方式,也可选用异步方式D.必须采用应答方式 3、挂接在总线上的多个部件___ _。 A.只能分时向总线发送数据,并只能分时从总线接收数据 B.只能分时向总线发送数据,但可同时从总线接收数据 C.可同时向总线发送数据,并同时从总线接收数据 D.可同时向总线发送数据,但只能分时从总线接收数据 4、总线从设备是____。 A.掌握总线控制权的设备 B.申请作为从设备的设备 C.被主设备访问的设备D.总线裁决部件 5、假设某系统总线在一个总线周期中传输4个字节信息,一个总线周期占用2个时钟周期,总线时钟频率为10MHz,则总线带宽是__ __。 A.10 MB/s B.20 MB/s C.40 MB/s D.80 MB/s 6、波特率表示传输线路上____。 A.信号的传输速率B.有效数据的传输速率 C.校验信号的传输速率D.干扰信号的传输速率 7、中断系统中的断点是指____。 A.子程序入口地址B.中断服务子程序入口地址 C.中断服务程序入口地址表D.中断返回地址 8、显示器的主要参数之一是分辨率,其含义是____。 A.显示屏幕的水平和垂直扫描频率 B.显示屏幕上光栅的列数和行数 C.可显示不同颜色的总线 D.同一个画面允许显示不同颜色的最大数目 9、下列选项中,能引起外部中断的事件是____。 A.键盘输入B.除数为0 C.浮点运算下溢D.访存缺页 10.CPU响应中断时,最先完成的两个步骤是_ __和保护现场信息。 A.开中断 B.恢复现场 C.关中断 D.不可屏蔽中断 11、在独立编址方式下,存储单元和I/O设备是靠来区分的。 A.不同的地址代码B.不同的地址总线 C.不同的指令和不同的控制信号D.上述都不同 12、计算机系统的输入/输出接口通常是__ __。 A.CPU与存储器之间的交界面B.存储器与打印机之间的交界面 C.主机与外围设备之间的交界面D.CPU与系统总线之间的交界面 13.根据连线的数量,总线可分为串行总线和_____ ___总线

第3章例题源程序

例3.1分别建立3×3、3×2和与矩阵A同样大小的零矩阵。 (1) 建立一个3×3零矩阵。 zeros(3) ans = 0 0 0 0 0 0 0 0 0 (2) 建立一个3×2零矩阵。 zeros(3,2) ans = 0 0 0 0 0 0 (3) 设A为2×3矩阵,则可以用zeros(size(A))建立一个与矩阵A同样大小零矩阵。 A=[1 2 3;4 5 6]; %产生一个2×3阶矩阵A zeros(size(A)) %产生一个与矩阵A同样大小的零矩阵 ans = 0 0 0 0 0 0 例3.2建立随机矩阵: (1) 在区间[20,50]内均匀分布的5阶随机矩阵。 (2) 均值为0.6、方差为0.1的5阶正态分布随机矩阵。 x=20+(50-20)*rand(5) y=0.6+sqrt(0.1)*randn(5) 例3.3将101~125等25个数填入一个5行5列的表格中,使其每行每列及对角线的和均为565。 M=100+magic(5) 例3.4求4阶希尔伯特矩阵及其逆矩阵。 命令如下: format rat %以有理形式输出 H=hilb(4) H=invhilb(4) format short %恢复默认输出格式 例3.5求(x+y)5的展开式。 pascal(6) 例3.6先建立5×5矩阵A,然后将A的第一行元素乘以1,第二行乘以2,…,第五行乘以5。 A=[17,0,1,0,15;23,5,7,14,16;4,0,13,0,22;10,12,19,21,3;... 11,18,25,2,19]; D=diag(1:5); D*A %用D左乘A,对A的每行乘以一个指定常数 例3.7 求方阵A的逆矩阵,且验证A与A-1是互逆的。

matlab程序设计实例

MATLAB 程序设计方法及若干程序实例 樊双喜 (河南大学数学与 信息科学学院开封475004) 摘要本文通过对 MATLAB 程序设计中的若干典型问题做简要的分析和总结,并在此基础上着重讨论了有关算法设计、程序的调试与测试、算法与程序的优化以及循环控制等方面的问题.还通过对一些程序实例做具体解析,来方便读者进行编程训练并掌握一些有关MATLAB 程序设计方面的基本概念、基本方法以及某些问题的处理技巧等.此外,在文章的最后还给出了几个常用数学方法的算法程序, 供读者参考使用.希望能对初学者进行 MATLAB 编程训练提供一些可供参考的材料,并起到一定的指导和激励作用,进而为MATLAB 编程入门打下好的基础. 关键字算法设计;程序调试与测试;程序优化;循环控制 1 算法与程序 1.1 算法与程序的关系算法被称为程序的灵魂,因此在介绍程序之前应先了 解什么是算法.所谓算 法就是对特定问题求解步骤的一种描述.对于一个较复杂的计算或是数据处理的问题,通常是先设计出在理论上可行的算法,即程序的操作步骤,然后再按照算法逐步翻译成相应的程序语言,即计算机可识别的语言. 所谓程序设计,就是使用在计算机上可执行的程序代码来有效的描述用于解决特定问题算法的过程.简单来说,程序就是指令的集合.结构化程序设计由于采用了模块分化与功能分解,自顶向下,即分而治之的方法,因而可将一个较复杂的问题分解为若干子问题,逐步求精.算法是操作的过程,而程序结构和程序流程则是算法的具体体现. 1.2MATLAB 语言的特点 MATLAB 语言简洁紧凑,使用方便灵活,库函数极其丰富,其语法规则与科技人员的思维和书写习惯相近,便于操作.MATLAB 程序书写形式自由,利用其丰富

主成分分析matlab源程序代码

263.862 1.61144 2.754680.266575 268.764 2.07218 2.617560.182597 261.196 1.59769 2.350370.182114 248.708 2.09609 2.852790.257724 253.365 1.69457 2.94920.189702 268.434 1.56819 2.781130.13252 258.741 2.14653 2.691110.136469 244.192 2.02156 2.226070.298066 219.738 1.61224 1.885990.166298 244.702 1.91477 2.259450.187569 245.286 2.12499 2.352820.161602 251.96 1.83714 2.535190.240271 251.164 1.74167 2.629610.211887 251.824 2.00133 2.626650.211991 257.68 2.14878 2.656860.203846] stdr=std(dataset);%求个变量的标准差 [n,m]=size(dataset);%定义矩阵行列数 sddata=dataset./stdr(ones(n,1),:);%将原始数据采集标准化 sddata%输出标准化数据 [p,princ,eigenvalue,t2]=princomp(sddata);%调用前三个主成分系数 p3=p(:,1:3);%提取前三个主成分得分系数,通过看行可以看出对应的原始数据的列,每个列在每个主成分的得分 p3%输出前三个主成分得分系数 sc=princ(:,1:3);%提取前三个主成分得分值 sc%输出前三个主成分得分值 e=eigenvalue(1:3)';%提取前三个特征根并转置 M=e(ones(m,1),:).^0.5;%输出前三个特征根并转置 compmat=p3.*M;%利用特征根构造变换矩阵 per=100*eigenvalue/sum(eigenvalue);%求出成分载荷矩阵的前三列 per %求出各主成分的贡献率 cumsum(per);%列出各主成分的累积贡献率 figure(1) pareto(per);%将贡献率绘成直方图 t2 figure(2) %输出各省与平局距离 plot(eigenvalue,'r+');%绘制方差贡献散点图 hold on %保持图形 plot(eigenvalue,'g-');%绘制方差贡献山麓图

第10章例题源程序

例10.1 设系统的微分方程为: ?????==-t e x x t x x 5.02'22'1 试建立系统仿真模型。 例10.2 利用Simulink 构建函数曲线y=5t 2+16。 例10.3 利用Simulink 仿真求I=? +10)1ln(dx x x 。 例10.4 有初始状态为0的二阶微分方程x"+0.2x'+0.4x=0.2u (t), 其中u(t)是单位阶跃函数,试建立系统模型并仿真。 例10.5 PID 控制器是在自动控制中经常使用的模块,在工程应用中其标准的数学模型为 )()/11()(s E N s T s T s T K s U d d i p ++= 其中采用了一阶环节来近似纯微分动作,为保证有良好的微分近似的效果,一般选N ≥10。试建立PID 控制器的模型并建立子系统。 例10.6 利用使能子系统构成一个正弦半波整流器。 例10.7 利用触发子系统将一锯齿波转换成方波。 例10.8 采用S 函数实现模块y=nx ,即模块的功能是把一个输入信号n 倍以后再输出。 (1) 利用MATLAB 语言编写S 函数。程序如下: %************************************************* %S 函数timesn.m ,其输出是输入的n 倍 %************************************************* function [sys,x0,str,ts]=timesn(t,x,u,flag,n) switch flag, case 0 %初始化 [sys,x0,str,ts]=mdlInitializeSizes; case 3 %计算输出量 sys=mdlOutputs(t,x,u,n); case {1,2,4,9} %未使用的flag 值 sys=[]; otherwise %出错处理 error(['Unhandle flag=',num2str(flag)]); end %************************************************* %mdlInitializeSizes :当flag 为0 时进行整个系统的初始化 %************************************************* function [sys,x0,str,ts]=mdlInitializeSizes(T) %调用函数simsizes 以创建结构体sizes

相关主题