观点丨关于Matlab的那些事


1.前言

我接触Matlab的时间比较长了,最开始是在大学里面的数学实验课上了解了一些,学了些基础的命令,后来参加过一次数学建模,又自学了点。而后由于所学的专业是生命科学和环境相关的东西,用到matlab的机会不多,主要是一些功能用matlab实现起来不是很方便,而且手边有现成的软件可以做到,例如图像分析,还有DNA序列分析都有现成软件等。本以为不会与其有太多交集。我下决心学习matlab是在经历几件事情之后。当时,在做硕士论文时需要对电泳图片做微生物种群的多样性分析和相似性分析,当时手头的软件只能将电泳图转化为各个泳道的灰度和位置方面的数据,而不能对数据进行分析,而能进行这样分析的软件(Bionumerics)比较贵,只为了这个用几次而买显然很不划算。无奈之下,我查了些文献,了解计算的原理后便用比较熟悉的matlab编程解决这个问题,其实这个程序比较简单——DGGE中条带Shannon多样性指数的计算 ,在现在看来,根本不值一提,但是在当时自我感觉还是不错的,相当有成就感了。后来在课程(数值分析,微分方程数值解)中matlab经常用到,另外在帮师姐做管理方面的数学模型时用的比较多,便自学了相关方面的知识,主要是看书,自己编程还有上网交流,这时在百度上回答了很多matlab相关的问题,并成为百度matlab技术论坛的副团长,在emuch中蒙前计算模拟区区长cenwanglai看重,聘为计算模拟版的版主。Matlab涉及的方面非常广,下面我就自己的理解谈下matlab一些特点和我学习matlab的一点体会,希望能对大家有点帮助,有什么不对的地方,敬请指正!

2.matlab的一些特点

A.Matlab是一个基于矩阵运算的软件,这恐怕是众所周知的事情了,但是,真正在运用的时候(就是在编程的时候),许多人(特别是初学者)往往没有注意到这个问题,因此,for循环(包括while循环)嵌套了十几层,这不仅是暴殄天物(没有发挥matlab所长),还浪费了你宝贵的时间,就只见左下角一直busy。

B.友好的界面,易于操作 ,虽然matlab一打开总看到命令行窗口,其实matlab有很多的GUI工具箱,可以很方便实现很多功能,对于一些不喜欢写代码的人来说,使用起来非常方便。举些例子曲线拟合工具箱cftool,曲面拟合工具箱sftool ,遗传算法工具箱gatool等等

C.matlab绘图功能,matlab可以非常方便的绘制二维,三维,四维,矢量图形。

例如:

plot: x轴和y轴均为线性刻度(Linear scale)

loglog: x轴和y轴均为对数刻度(Logarithmic scale)

semilogx: x轴为对数刻度,y轴为线性刻度

semilogy: x轴为线性刻度,y轴为对数刻度

bar 长条图

errorbar 图形加上误差范围

fplot 较精确的函数图形

polar 极座标图

hist 累计图

rose 极座标累计图

stairs 阶梯图

stem 针状图

fill 实心图

feather 羽毛图

compass 罗盘图

quiver 向量场图

下面给几个matlab绘出一些特殊图形看看matlab绘图的效果

D.丰富的库函数(而且比较好用),这个看自己专业相关工具箱,涉及太广无法一一介绍。

3. 学习matlab心得体会

我觉以下几点对于学好matlab很重要:兴趣、悟性、勤奋、坚持

兴趣,不知道哪位名人说过“兴趣是最好的老师。”我觉得非常有道理,我曾对于matlab制作动画很感兴趣,并收集了很多例子,在小木虫贴出来后很多人对于matlab制作动画都很感兴趣,计算模拟版活动---程序模拟动画展示 ,一个人一旦对某事物有了浓厚的兴趣,就会主动去求知、去探索、去实践,并在求知、探索、实践中产生愉快的情绪和体验。这样才能主动学习,并且学好到精通。

悟性,通常人认为指顿悟,慧根,我觉得就是对一个问题不断的思索,将自己的体会和感受融合,获得属于自己的知识。有很多事情、问题,都是可以想明白的。只有不停的想,才能想明白,想透彻。就像我自己解决matlab编程进行DGGE电泳图谱多样性相似性分析,当时没有工具,而且问题必须解决,于是我不停的想,吃饭时,睡觉前,最终终于解决。

勤奋,一勤天下无难事。从古到今,有多少名人不是有勤奋而得来成功的。现在的年轻人,一代比一代聪明。要不被别人淘汰,要超越别人,只有靠时间堆出来。每天多学一些,多积累一些。学习matlab也一样,想要学会,使用熟练,不花时间练习,写代码,亲自运行调试,是很难掌握好的。

坚持,认准了的事情,就坚持做到底,直到有所收获。事实上,很多人实现不了自己的目标,很大程度上就是少了一种坚持、非要把事情干到底的精神,他们往往浅尝辄止,因此眼睁睁失去了可能到手的成功。光有兴趣,只有三分钟的热情是很难成事的。很多事情的成功取决于踏平坎坷地坚持的毅力。看准了的事情,如果没有百折不挠的坚持,绝难取得成功。看准的事情就不屈不挠地坚持干下去直至成功,才是智者的唯一选择。每一个人都明白所有梦想的实现都需要努力,然而,很多人只所以没有实现心中的梦想,就在于多了空想、犹豫,少了努力坚持。

至于具体方法

1.多动手写程序、调试

这里有些常见错误提示信息供大家参考

1.Subscript indices must either be real positive integers orlogicals

中文解释:下标索引必须是正整数类型或者逻辑类型

出错原因:在访问矩阵(包括向量、二维矩阵、多维数组,下同)的过程中,下标索引要么从 0 开始,要么出现了负数。注:matlab的语法规定矩阵的索引从 1 开始,这与 C 等编程语言的习惯不一样。

解决办法:自己调试一下程序,把下标为 0 或者负数的地方修正。

2.Undefined function or variable "a"

中文解释:函数或变量 a 没有定义

3.Input argument "x" is undefined

中文解释:输入变量 x 没有定义

4.Matrix dimensions must agree

Inner matrix dimensions must agree

中文解释:矩阵的维数必须一致

出错原因:这是由于运算符(= + - / * 等)两边的运算对象维数不匹配造成的,典型的出错原因是错用了矩阵运算符。matlab通过“.”来区分矩阵运算和元素运算

5.Function definitions are not permitted at the prompt or inscripts

中文解释:不能在命令窗口或者脚本文件中定义函数

出错原因:一旦在命令窗口写 function c = myPlus(a,b),此错误就会出现,因为函数只能定义在 m 文件中

6. 1) X must have one or two columns

2)Vectors must be the samelengths

中文解释:

1. X 必须是 1 或者 2 列

2. 向量长度必须一致

7.One or more output arguments not assigned during call to'...'

中文解释:在调用...函数过程中,一个或多个输出变量没有被赋值

8.??? Error using ==> mpower

Matrix must be square

中文解释:错误使用mpwoer函数,要求矩阵必须是方阵

9.Explicit integral could not be found.

中文解释:显式解没有找到

10.Index exceeds matrix dimensions.

Attempted to access b(3,2); index out of bounds becausesize(b)=[2,2].

中文解释:索引超出矩阵的范围

11.In an assignment A(I) =B, the number of elements in B and I must be the same

中文解释:在赋值语句 A(I) = B 中,B 和 I 的元素个数必须相同

12.To RESHAPE the number of elements must not change

中文解释:矩阵变换时,变换前和变换后的总元素不能改变

2.善于利用MATLAB的帮助

一遇到什么问题,通常我的第一反应是:help,就先说说自己对help的一些常用方法吧。

1)命令窗口直接敲“help”,你就可以得到本地机器上matlab的基本的帮助信息。

2)对于某些不是很明确的命令,只知道大体所属范围,譬如说某个工具箱,直接在命令窗口中敲入

Help toolboxname,一帮可以得到本工具箱有关的信息:版本号,函数名等。

3)知道函数名,直接用help funname就可以得到相应的帮助信息。

3.善于向别人学习,多看牛人写的代码并消化

三人行,必有我师,一个人很难什么都精通,取长补短是最快的进步方法。Matlab的File exchange和pudn上都用很多代码,多看看牛人写的代码,了解他们编程技巧和思想,并消化,对于提高自己的编程水平非常有利。

4.时间积累

“冰冻三尺非一日之寒”,学习需要日积月累,多积累一些matlab的技巧,对于编程是很有利的,比如求序列中的极值,下面一些正是小代码体现大智慧的典范!

利用数学里驻点和极值点定义来求。

CODE:

--------------------------------------ilxy的方法-------------------------------------------------------------------
>> aa=randperm(20)  
aa =  
16 13 17 7 19 18 14 8 11 2 20 3 6 4 15 1 12 10 5 9  
>> bb=intersect(find(diff(aa)>0)+1,find(diff(aa)<0))  
bb =  
    3 5 9 11 13 15 17  
---------------------------------------------------------------------------------------------------------------------
----------------------------------hyperelastic 的方法----------------------------------------------------------  
N = 100;  
aa=randperm(N);  
index = find(((aa(2:N-1)>aa(1:N-2))+(aa(2:N-1)>aa(3:N)))==2)+1;  
bb = aa(index);  
-------------------bainhome  的方法-----------------------------------------------------------------------------
a=rand(1,100);   find(diff(sign(diff(a)))>0)+1
---------------------------------------------------------------------------------------------------------------------
以上代码都是求极大值,略微变换后可以得到极小值。出自:中华钢结构论坛
------------------------------------eight版主给的方法------------------------------------------------------------
d=diff(x);
n=length(d);
d1=d(1:n-1);
d2=d(2:n);
indmin=find(d1.*d2<0 & d1<0)+1;
indmax=find(d1.*d2<0 & d1>0)+1;
---------------------------------------------------------------------------------------------------------------------
虽然基本原理一样,不过方法都各有特色。都是前辈们智慧的结晶。
 

4.matlab的一些资源

1)  http://www.mathworks.com mathworks的官方网站

2) http://www.matlabsky.com/forum.php matlab技术论坛

3) http://www.ilovematlab.cn/forum.php matlb中文论坛

4) http://www.mathworks.cn/matlabcentral/fileexchange 可以下载一些matlab代码

本文转载自小木虫作者dbb627,链接:http://muchong.com/t-4340045-1

材料牛石小梅编辑整理。

分享到