Matlab编程技巧二则_代西武.pdf
?文章编号:1004-6011(2008)02-0059-02Matlab 编程技巧二则代西武(北京建筑工程学院 理学院,北京?100044)摘?要:通过两个示例,研究了 Matlab 编程的向量化方法,并且与一般的编程方法进行比较,发现向量化编程确实很简单.关键词:Matlab;向量化;编程中图分类号:TP319文献标志码:ATwo Tips in Matlab ProgrammingDai Xiwu(School of Science,BU CEA Beijing 100044)Abstract:The vectorization programming method in Matlab is studied by two examples.Compared tothe popular programming method,the vectorization programming method is very simple.Key words:MATLAB;vectorization;programming?收稿日期:2007-04-14作者简介:代西武(1963?),男,副教授,硕士,研究方向:计算机科学、图论、数学建模.?我们学习计算机编程,一般是从BASIC、C 语言等开始的,对数组或矩阵的操作运算都是用循环语句来实现的,比较麻烦,并且受到了一些限制,如:变量(特别是数组变量)在使用之前必须定义、只能对数组的单个元素进行存储操作等.而 Matlab 中的矩阵运算很丰富,也很灵活,对矩阵的操作运算非常方便,可以对矩阵进行整体操作,在用 Matlab 编写程序时,应该摒弃原来的思维习惯,充分利用 Mat?lab 矩阵的整体操作功能,即学会?向量化?编程.下面以两个例子说明向量化编程方法,并且与一般的编程方法进行比较,发现向量化编程确实简单.1?矩阵的副转置在线性代数里,我们对矩阵的转置是很熟悉的,也就是将一个矩阵的第一行变为第一列,第二行变为第二列,?,直到最后一行变为最后一列,这样得到的新矩阵就是原来矩阵的转置.下面我们给出矩阵的副转置的定义.定义:对于给定的矩阵 A,将其第一行颠倒后变为最后一列,第二行颠倒后变为倒数第二列,?,直到最后一行颠倒后变为第一列,这样得到的新矩阵称为原来矩阵的副转置,记为 AS.其实,对于方阵而言,其副转置,可以理解为是按照副对角线对称得到的矩阵.下面的例子是矩阵A 及其副转置AS.A=129821399314976978,AS=863279799989141312下面的程序段给出了计算矩阵副转置的三种方法:%Initial the matrix a.a=12?98?213?99?314?97?69?7?8第 24 卷 第 2期2008年 6月北 京 建 筑 工 程 学 院 学 报Journal of Beijing University of Civil Engineering and ArchitectureVol.24 No.2Jun.2008%The first method,i.e.C language version.m,n=size(a);d=zeros(n,m);for i=1:m?for j=1:n?d(n-j+1,m-i+1)=a(i,j);?endend%T he second method,i.e.Vectorization pro?gramming by using the Matlab functions.c=fliplr(a);c=flipud(c);c=c?%T he third method,i.e.Vectorization pro?gramming.b=a(end:-1:1,end:-1:1)?从程序段中,可以看出这三种方法的特点:第一种方法是按照 C 语言的思想方法编写出来的,用到了二重循环,比较繁琐,在 Matlab 编程时应当避免使用这样的方法.第二种方法是向量化编程,有三个语句,利用了 Matlab 的两个函数 fliplr、flipud,第三个语句是求矩阵的转置,此方法比较简单,并且思路也很清楚.第三种方法也是向量化编程,只是一个语句,就计算出矩阵 a 的副转置,存放在矩阵 b里,这种方法很简单,只是利用了 Matlab 的关键字end,并且计算了矩阵的转置,是 Matlab 编程中提倡的方法.2?将矩阵里的某些行颠倒问题的提出:给一个矩阵,其元素本应该都是大于零的,但由于某些行的元素较少,就将这些行的非零元素排在相应行的左边,右边的空位置以 0 补齐.如矩阵 AA=3520113026390112200056776699现在的任务是将含有零的行左右颠倒,并且保持相应行的起始元素为非零元素,零元素还排在右边保持不动.如:A 矩阵经过将含有零元素的行左右颠倒后得到矩阵 BB=3520113093620221100056776699下面,我们给出解决这一问题的两个不同的程序段,首先给出用 C 语言的思想方法编写出的 Mat?lab 程序段如下:%Chose some lines,to flip the non-zeros elementsby left and right way.%The first version,i.e.the C language version.a=3?5?20?11?30;2?6?3?9?0;11?22?0?0?0;5?6?77?66?99;m,n=size(a);te=zeros(1,n);for i=1:m?if a(i,n)=0?k=0;?for j=n:-1:1?if a(i,j)=0?k=k+1;?te(k)=a(i,j);?end?end?for j=1:k?a(i,j)=te(j);?end?end?end注意到,此程序段有这样的特点:整体是一个双重循环,对单个的元素进行操作,比较复杂.计算后的结果矩阵还存放在矩阵 a 里.其次,给出具有 Matlab 特点的向量化编程如下:%Chose some lines,to flip the non?zeroselements byleft and right way.%The second version,i.e.Vectorization program?ming.(下转第 63 页)60北 京 建 筑 工 程 学 院 学 报2008 年qkxk+f(k,xk)yk,所以由条件?知(J?(?),y)=0,因此 J?(?)=?,所以?是J 的一个临界点.由条件?中的?k f?u(k,0)知存在?1 0,当|u|?1时,f(k,u)u?k+?1,其中?1=12(?-r)0,所以 F(k,u)?12(?k+?1)u2,|u|?1.所以当 x?V1=span?1,?2,?N-1并且?x?1时,根据文献 1 中的(3?11)式有J(x)?-?12?x?,(6)这说明?是J 的一个非极小临界点.又因为 f?u(k,0)-qk,所以存在?2 0,?2 0,当|u|?2时,f(k,u)u?-qk+?2,所以 F(k,u)?12(-qk+?2)u2,|u|?2.于是当 x?V2=span?N 并且?x?2时,J(x)=-12xTAx+12?Nk=1qk|xk|2+?Nk=1Fk(k,xk)?12?Nk=1qk|xk|2+12?Nk=1(-qk+?2)|xk|2=12?2?x?2.(7)由(6)及(7)式,根据引理 1?4 知?是J 的一个同调非平凡临界点.再由条件?、?及引理 1?3 知 J 在H 上有下界,并且满足 P?S?条件.于是,由引理1?5知 J 在H 上至少有三个临界点,所以问题(1)至少有三个不同的解.参考文献:1?Liang H,Weng P.Existence and multiple solutions forsecond?order difference boundary value problem via criti?cal point theoryJ.J.Math.Anal.Appl,2007(326):511-5202?Liu J,Su J.Remarks on multiple nontrivial solutions forquasi?linear resonant problems J.J.Math.Anal.Ap?pl,2001(258):209-2223?张恭庆.临界点理论及其应用 M.上海:上海科学技术出版社,1985 责任编辑:佟启巾(上接第 60 页)a=3?5?20?11?30;2?6?3?9?0;11?22?0?0?0;5?6?77?66?99;m,n=size(a);for i=1:m?if a(i,n)=0?a(i,a(i,:)0)=fliplr(a(i,a(i,:)0);?endend注意到,此程序段有以下特点:整体是一个单循环,循环体是一个语句,非常简单.因为我们是对某些行的元素进行整体操作,所以循环体就只含有一个语句.计算后的结果矩阵仍然存放在矩阵 a 里.用到了 Matlab 里的函数fliplr,也用到了逻辑矩阵 a(i,a(i,:)0)等 Matlab的特有功能.3?结束语Matlab软件以其功能强大、操作简单而被公认为是准确、可靠、优秀的科学和工程计算软件,近些年来愈加流行.但是缺少研究介绍 Matlab 向量化编程方面的资料和书籍,上面研究的只是两个示例,希望能够对应用 Matlab 软件的人员有所启发和帮助.参考文献:1?MathWorks.Matlab 7.0.20042?张志涌,杨祖樱.Matlab 教程M.北京:北京航空航天大学出版社,20063?刘宁元,李小平.数学绘图实验中如何选择 Matlab 函数 J.电脑知识与技术(学术交流),2007,14(05)责任编辑:佟启巾63?第 2 期王庆云:非线性二阶差分方程边值问题的多解性