不记得上一次写超过20行的matlab程序是什么时候了,大概是2013年吧,那个时候写过2篇文章,实际用到了 一些matlab的内容,超过200行的matlab程序应该要追溯到2011年了,最近为了帮助网友解决我博客一篇文章的问题,把自己2011年的matlab翻出来,感触颇多,一言难尽,看到昔日熟悉的代码,我居然能理解,然后还能修修改过,感觉好多年没用了,连基本函数都忘记了,还是碰到问题还是会写会改,这里面也说明了编程不简单是一个记忆和经验的问题,更重要的是学习的方法和解决问题方法的问题。所以决定写这篇文章把我说认识的Matlab的东西写出来,也许再过一些年,我将老去,也不会再用Matlab了,这样的话,算是给10年Matlab使用之路一个终结吧。
本站Matlab技术文章目录: 【目录】Matlab和C#混合编程文章目录
本文原文地址: 接触Matlab10年后的一个总结,随时使用Matlab而掌握的一些要点
准确的说这篇文章不是给完全的编程新手,特别是以前没有过一定编程经验的人准备的。
文章的适合对象是 :已经有一定编程基础的人,如果你想用Matlab来快速的完成算法验证,以及科研学术研究等。
文章的范围很大,信息量很大,个别问题新手不是很理解,请自行百度。至于有编程经验的,本文提到的大部分内容应该是可以理解的,根据思路,打开Matlab软件也应该是可以选择的。
本文选择的Matlab版本是:2012a,个人觉得这个版本一直都还不错吧。新的版本虽然菜单中文化,但那个UI真是丑爆了,无力吐槽,也没必要换。
另外,这里提醒广大Matlab使用者,对于80%人来说,低版本真的够了,没必要追求太高,特别是那些连破解或者工具箱选择都不知道啥意思的,选择一个低版本,麻烦事情可能会更少。新版本的破解很多不全面,自己安装的时候要注意。很多人碰到这个问题,工具箱都没安装,你要找函数,怎么找得到。。。
在国内,目前使用Matlab的主要人群是学生和科研单位,商业环境的使用我见过一些,但很少。就不做推测和评价了。
Matlab如何如此受欢迎,我总结是4个方面:
1.高效的数值计算功能。这一点是出类拔萃,目前其他编程语言以及其他类似的数学软件无可替代;
2.完备的计算结果和编程可视化功能。这一点同样是出类拔萃,无可替代;我的博客有Matlab专栏,大部分是C#调用Matlab进行混合编程的问题,每一年都有大量的学生和其他工程人员有这个需求:直接调用Matlab的Figure。。。潜入到WinForm中去。。。这和Matlab的结果优秀的可视化功能密不可分;
3.友好完善的编程开发环境,以及接近数学表达式的自然化m语言。非常易于学习和掌握;Matlab软件就是一个编程开发环境,自带的m语言简单易用,有编程开发经验的人应该是非常容易掌握的;
4.功能丰富的应用工具箱与Help系统,目前Matlab的工具箱总数已经超过80个,覆盖了数学,统计,仿真,电子,生物信息学,金融,测试等等各个方面。与其说Matlab强大,不如说它的工具箱强大,每一个工具箱都包括与涵盖了行业内经典的一些算法和处理方法。省去了大量的麻烦,所以对于科研来说,快速的验证自己的想法,实现算法并进行测试。
如果要使用Matlab,安装Matlab必不可少,下面是Matlab的主界面,下面介绍几个主要窗口的作用。本文使用的是Matlab2012a,其他版本如果是Ribbon UI,除了菜单不一样,窗口也大概类似的。
上面就是Matlab的主界面,我用的是2012a版本,新版本2013后可能有些改变,感觉更丑。。还是这个习惯。但大概功能都差不多。看看每个部分的功能吧,菜单栏暂时就不说了,看名字一般都能懂。具体说说上图各个部分的作用。
1.Current Folder:当前路径。是当前matlab工作文件夹的路径,这个一般启动改好后,不会变动,作用不大,但有时候找文件用得上;这里会加载你经常使用的Matlab目录,可以通过下拉箭头快速切换不同的Matlab工作路径;
2.Current Folder:也是当前的工作文件夹的文件显示,这里显示文件夹的所有资源,比较好懂,需要打开文件的时候,双击对应m文件就可以了;
3.单个m文件或者函数,点击之后,会在4中显示包含的函数,就比如VS显示类中的属性,方法之类的,可以了解文件结构;
4.是3中选择文件中包括的函数,不用打开文件夹,就可以看到m文件中的函数结构;
5.Command Window 主窗口,也就是输入命令的地方,最最重要的地方吧,做一些简单的测试,学习命令的时候都可以在这里面进行,不过习惯后更喜欢用m文件,习惯就知道了;
6.WorkSpace,工作变量空间,主要是显示当前matlab中存在的变量的值,包括变量名称,值,如果是数组,会显示最大,最小值,这个地方主要是调试程序用的,相当于VS中加断点后的局部变量的值,只不过这里显示更加直观,非常有用。
7.Command History,历史命令窗口。这里有一个小技巧,就是你在命令窗口输入的命令,这里都会显示,而且你还可以用小键盘的,上下键来直接跳到前面的命令,测试的时候也更加方便;
经常使用Matlab的命令或者进行一些简单的测试,掌握和知道一些常见的命令是很有必要的,下面这些命令如果记不住,可以根据功能百度,找到对应的函数,再用,其实很快。熟练之后,也就30秒钟的事情,多了,也就记住了。
1.clear :清除内存变量和函数,也就是把WorkSpace的变量给清空;
2.clc :清楚当前Matlab命令窗口的内容;相当于清楚屏幕吧,重新开始,简洁一点,注意clc是不清楚变量的。一般在编写m文件的时候,不是函数的话,前面一般都要加上 clear;clc; 目的就是在m文件运行的时候,把内存和屏幕都清空,以免同名称的变量影响以及屏幕容易观察;
3.help :这也是最重要的一个函数吧。在想要知道某个函数的相关说明的时候,可以使用help 函数名来获取,当然也可以打开帮助文档。不过这种方法是比较快的。
4.zeros:创建1个都为0的矩阵;ones:创建1个都为1的矩阵。参数可以是多维的,例如zeros(2,3)...
5.size:可以计算矩阵的大小,同样相关的还有length,size可以计算不同的维上的大小,例如size(A,1)..
6.rand :随机数生成器,可以直接使用生成任意纬度的矩阵,例如rand(2,3),也是一个经常用的东西;
6.plot:绘制图像的操作,具体格式可以参考帮助。操作应该非常频繁,做科研的时候,经常要看趋势,绘图在matlab是非常常见的一件事情。。。还有一个subplot函数是将一个figure分割为多个块来操作。想想自己在C#中用mschart绘图,也是醉了。。。不过仍然得坚持,这些年来为什么抛弃matlab,所有matlab可以干的事情都拿C#来干,是一个很远的话题,以后有机会再说吧。
7.figure,hold on:在使用plot绘图的时候,默认都是在figure上面,figure可以新建一个空白图像,同时还可以使用hold on在同一个figure上面绘制多条曲线;
最重要的几个函数就介绍在这里吧。要掌握matlab的核心语法,还得看一下基本的matlab矩阵操作的语法,太灵活了 ,掌握几个基本的就可以完成很多工作了。
前面已经提到Matlab最重要的一点强大的数值计算功能,不仅体现其函数库的强大,更重要的是其操作语法的灵活性。随便找一本Matlab的编程入门书籍,肯定有这方面的介绍。其实矩阵操作的灵活性,强大到以至于我不敢看,日常只要掌握几个基本的操作就可以做很多事情了。特别在这里特别介绍一下,可以给你提高不少效率。
在编写各种算法的时候,经常要对矩阵初始化。例如前面提到的zeros,one,等等都是产生矩阵的方法,同样还有其他的产生对角矩阵等方法。这里特别要提到的是产生数据或者等差数列的方法。例如
a = 1 : 10 ;%产生1-10的步长默认为1的等差数列; b = 0:0.1:1;%产生0-1的步长为0.1的等差数量;
是不是很简洁高效。。。在其他编程语言,可能自己要封装一个方法了。然后来调用,但是在matlab里面,这一切都简化了。
在matlab中,数组或者叫做矩阵是可以任意扩充的,不需要其他,同样对矩阵的变化易如反掌,不需要那些for循环来进行。看看几个例子,管中窥豹,大家以此类推:
data = rand(4,4) %初始化1个10*10的随机矩阵 a = data(:,1) %取data的所有行,第1列 b = data(:,[1,3]) %取所有行,第1,3列 c = data([2,3],[1,2]) %%取第2,3行,以及1,2列
看下面的运行结果,比较直观:
其他还有更多,如find就不多说了。。。。这里只是冰山一角。。
看完上面的语法,有没有心动?那接下来看看matlab的m语言的一些基本语法。我们可以在命令行窗口做一些简单的测试,但并不适合于开放。当我们要完成一个完整的逻辑时,那就要用到m文件编辑器了。打开编辑器,界面如下,你就可以写了。。。这个开发环境也很强大,可以断点调试,分步执行。这是一篇总结性的文章,我身边也没有了matlab书籍,所以想到哪写到哪吧。
1.matlab中变量名 大小写敏感的 ,官方的函数里面也没有所谓的命名规则,基本都是小写开头,习惯就好了
2.注意,如果一行语句结束, 后面不加;号,就会直接在Command Window显示变量的值 ,加分号就只显示在WorkSpace了,在命令行窗口也是这样的,不信你可以试一下, a = 100; 和 b = 100 的区别
4.变量无需定义,你可以给它一个[]空值,在使用的时候再赋其他值。它的长度也不是固定的,你可以按你想象进行增加。
5.matlab的数据类型中,个人认为比较变态的是字符和元胞,元胞数组是一个大杂烩,可以容纳各种复杂的类型,而字符类型,踩过不少坑,每次都转不过弯来。这里分享一下。matlab拼接字符串路径或者数组,不是我们其他编程语言想象的那样哦。用 + 就可以解决。需要这样:
['ab' 'cde' num2str(2)] %注意中间有空格,结果:abcde2
6.虽然矩阵操作,很灵活,大部分的都可以直接一句话完成,但免不了还是要用循环的。matlab也有for,while语法。需要注意的是,每一层的for 或者while都要对应end 才行。
7.在matlab中,现在也支持面向对象编程,但我不会,使用Matlab暂时也只是用用函数,面向过程的编程啊。。。面向对象编程的使用如果大家有兴趣可以去找一下相关资料啊。matlab最常用的还是函数,和其他语言的方法类似。但是matlab的函数没有静态方法和实例方法之分,总的来说,都是静态的吧,直接调用。
编写函数使用的关键字是 function ,输入和输出参数可以是多个,例如 function [r1,r2,r3] = testfun(p1,p2,p3)
这里有一个注意:函数是不能直接运行的,大家可以写一个m文件调用你写的函数 就可以了,这个有编程经验的应该都懂,我要说的是,在c#中调用matlab的函数的时候,必须是function才能够被编译和调用,非function是不支持的哦。
虽然会Matlab做很多事情,但现在我已经完全脱离它了,刚开始很多不习惯,比如很多数学函数要自己写,自己去发掘,但通过慢慢积累,并发掘开源的资源,我使用了Math.NET组件来替代了它的数值计算部分,虽然语法没那么优雅,但是功能上没问题了。至于其他的功能组件,比如统计,数据挖掘等工具箱,也有相应的开源组件来完成,实在找不到的,自己根据算法来完成,其实也不难,所以在这个过程中,使用C#的能力也越来越强。
这并不是说Matlab不好,Matlab目前最大的问题,从实际应用上来说,主要有几个确定:
1.大的不能再大的MCR运行时,曾几何时,.NET 几十M的.net环境,就让人受不了,更加不用说Matlab的MCR,300多M了。安装后超过1G。。
2.在与其他平台交互应用还不太灵活与方便,例如在C#中调用Matlab的m函数,虽然现在支持还不错,但效率和使用门槛还是有一定的差距,不能普及;
3.虽然Matlab在分布式计算,效率以及部署方面花了很大精力,也越来越好用,但是价格让人望而却步。。。有几个工具箱我都没找到破解版。。无法试用;这方面是一个硬伤吧,别说学习了,即使买了,招几个这样的人都是个难事。。。
4.Matlab的资源太少,目前主流的开源项目托管平台,Matlab项目寥寥无几,虽然官方有一个开源的交流论坛,但人气太低,而且也是英文的,没什么用。。加上国内的研究人员,各自为战,基本不分享一些写过的Matlab代码,所以后人前仆后继,每天都在写重复的代码。。。
每一次安装系统的时候,总是莫名其妙的要把Matlab给安装上去,但貌似很少打开,这个月还打开了几次。。。希望不是终点,Matlab的确是一个好的工具。
最后说一下Matlab的帮助系统吧:在若干年前微软的MSDN还有离线版的时候,它应该是最好的帮助系统吧。但现在MSDN好像都不包括在VS的安装包里面了,离线版也没有多大的意义。但是Matlab一直在这样做,这也是它强大的原因之一。所以的东西都可以从帮助文档中得到。但前提你得会基本的英文,这也是一大硬伤吧,没有中文版,不过想想也可怕,这么多文章翻译为不同版本,工作量得多大。以前有论坛翻译这些文档中的函数,但好像被官方叫停了,版权原因。悲哀,人家给你免费普及做广告,居然这样。。。最后附上一张图,曾经摸爬打滚过的help系统: