上学期学了一些matlab的知识,这学期再用时竟然发现已经忘得差不多了(┬_┬)
于是决定重新开始并将它们记录下来,也方便自己以后查漏补缺!
M文件编程
- 脚本文件
matlab有自己的命令行窗口,对于简单的命令,可以直接在命令行窗口输入,但随着命令行的增加或者命令本身复杂度的增加,再使用命令行就显得有些不便了,这时就需要脚本文件了。可以说,脚本文件是matlab指令集合的封装。
- 函数文件
函数文件以function开始,end结束,这也是区别于脚本文件的地方。
在function后面接着定义输出参数,函数名和输入参数,比如:
function [x,y,z] = math_count(a,b,c)
x,y,z是输出参数,以方框括起来,math_count是函数名,a,b,c是输入参数,以圆括号括起来。
也可以没有参数,比如:
function printresults(x,y)
printresults是函数名,x和y是输入参数,没有输出参数。
- 数据类型
matlab共有6中基本数据类型,分别是数值类型、逻辑类型、字符串、函数句柄、结构体和单元数组。这里我们简单地介绍前四种。
- 数值类型
基本的数值类型包括整数类型和浮点数类型,额外的数值类型还有复数类型、无穷量(Inf)和非数值量(NaN),后面的两种算是matlab的特色类型,当然要记录一下啦!
-
- 复数类型
复数包括实部和虚部两部分,matlab中默认使用i和j作为复数的虚部标志。创建复数时,可以直接利用复数形式进行输入或使用函数complex。
z=1+2i %利用复数形式进行输入
输出结果:
z=complex(2,3) %利用complex(x,y)函数进行输入
输出结果:
z=complex(2)%利用complex(x),如果x是实数,z=x+0i,如果x是复数,z=x
输出结果:
-
- 无穷量(Inf)和非数值量(NaN)
Matlab中使用Inf和-Inf分别代表正无穷量和负无穷量,NaN代表非数值量。
正负无穷量通常由于运算溢出而产生的结果,而非数值量是由于0/0或Inf/Inf非正常运算产生的结果,并且这两个NaN是不同的。
Inf和NaN是Matlab中的特殊变量,除此之外,Matlab还有一些特殊的变量
-
- ans:系统默认的用作保存运算结果的变量名
- pi:圆周率
- eps:机器零阀值,Matlab中的最小数
2.逻辑类型
Matlab把任何非0值当作为真,输出为1,把零当作假,输出为0.
逻辑类型数据进行运算时需要用到关系操作符和逻辑运算符。
对于Matlab的关系操作符,与c/c++基本相同,只有不等号有所不同,在c/c++中不等号为!=,而Matlab中不等号是~ =。
3.字符和字符串
字符和字符串分别是字符数组和字符串数组中的文本。
- 字符数组是一个字符序列,如c='Hello Word!'
- 字符串数组是文本片段的容器,字符串数组提供一组用于将文本处理为数据的函数。从R2017a开始,字符串也可以使用双引号创建,如str="You are best!"
- string函数
R2016b以后,可以使用字符串数组string代替字符数组。官方文档表明,还可以按照标准数组运算对字符串数组
进行索引、重构和串联,还可以使用 +
运算符向字符串追加文本。(一切都在向c++看齐啊)
4.函数句柄
函数句柄是一种间接调用函数的方式,相当于对一个函数取别名。
例如:如果你有一个函数为myfunction,现在给定语句
f=@myfunction %f是一个句柄,可以通过f调用myfunction
可以通过函数句柄构造匿名函数或指定回调函数,也可以函数句柄将一个函数传递给另一个函数,或者从主函数内部调用局部函数
下面给出通过函数句柄间接调用函数的例子:
在命令行窗口输入:
Handle=@sin; %也可以自己建立函数,通过函数句柄间接调用 >> x=0:pi/4:pi; %通过冒号创建一维数组,0是第一个数,每次以pi/4为单位递增,pi是最后一个数 >> y=Handle(x)
输出结果:
有同学可能会问,直接调用不也是可以吗,的确可以,但函数句柄有更多的优点,列举几个
- 提高运行速度。matlab对函数的调用每次都要搜索所有的路径,使用函数句柄可以减少搜索,提高运行速度。
- 使用更方便。比如说,我在这个目录运行后,创建了本目录的一个函数句柄,当我转到其他的目录下的时候,创建的函数句柄还是可以直接调用的,而不需要把那个函数文件拷贝 过来。因为你创建的函数句柄中已经包含了路径。
- 控制流
Matlab的控制流也与c/c++大体相同,唯一要注意的是每个条件都有相应的end关键字。
-
- 顺序结构
-
选择结构
- if—end
- if—else—end
- if—elseif—else—end
示例:
新建脚本文件,保存为exe1_1
x=input('enter''x'':');%input函数返回你输入的整数,提示信息用''括起来,如果想要输出单引号,两个单引号'' ''即可 if(x>0) y=1; elseif(x==0) y=0; else y=-1; end %不要忘记加end,Matlab不会自动补全end,最好一开始就写下来,养成良好的编程习惯至关重要 disp(y) %disp作为输出函数
在命令行窗口调用exe1_1,输入-5
得到结果:
- switch—case结构
- 注意Matlab与c/c++语言的switch-case结构不一样:只要条件满足,立即返回,这也是为什么不用加break的原因。
示例:新建脚本文件,保存为ex1_2
month=3; switch month case {3,4,5} season='spring' case {6,7,8} season='summer' case {9,10,11} season='autumn' otherwise season='winter' end
得到结果:
注意
1.M文件的搜索路径必须与当前路径一致,否则运行会出错,搜索路径即保存M文件的位置。可以直接修改当前路径与搜索路径一致,也可以添加搜索路径,这样就一劳永逸了。
2.如果遇到不认识的函数,可以利用help/doc命令在命令行查找,格式为help/doc function,function为函数名,养成查阅文档的习惯很重要!
-
循环结构
- while,for语句
- break、continue、return ——行尾可以不用加分号
每一个关键字后面都要有与之对应的end关键字
范例:
使用0.618法(黄金分割法)极小化f(t)=exp(-t)+exp(t),区间为[-1,1]。(即逼近函数在已知区间的极小值,找到对应的t
0.618法主要思想:
0.618法在给定区间[a,b]内适当插入两点a1,a2,并计算其函数值。
a1,a2将区间分成三段,通过函数值大小的比较,删去其中一段,使搜索区间得以缩小,
然后再在保留下来的区间上作同样的处理,如此迭代下去,从而得到极小点的数值近似解。
0.618法主要步骤:
1.在区间[a,b]内分别按照0.618和0.382的比例处取点a1 ,a2, 把[a,b]分为三段。
2.如果f(a1)>f(a2),令a=a1,a1=a2,a2=a+0.618*(b-a)
3.如果f(a1)<f(a2) ,令b=a2,a2=a1,a1=a+0.382*(b-a)
4.如果满足迭代条件或者超出给定迭代次数,程序终止,否则继续运行下去。
新建名为fai.m的函数和zero_soe.m的函数
1 function z= fai(t) 2 % fai函数 3 % 给定函数 4 z=1*exp(-t)+1*exp(t); 5 end
1 function [k] = zero_soe(a0,b0,iter,tol) 2 %UNTITLED3 精确线性搜索之0.618法 3 % a0,b0分别代表左端点,右端点 4 % iter代表给定的迭代次数 5 % tol代表误差限 6 m=a0+0.382*(b0-a0); %试探点lameda0 7 n=a0+0.618*(b0-a0); %试探点u0 8 ym=fai(m); 9 yn=fai(n); 10 count=0; %现有的迭代次数 11 while(count<iter) 12 if(ym>yn) 13 if(b0-m<=tol) 14 k=n; 15 return; 16 else
17 a0=m; 18 m=n; 19 ym=yn; 20 n=a0+0.618*(b0-a0); 21 yn=fai(n); 22 count=count+1; 23 end 24 else
25 if(n-a0<=tol) 26 k=m; 27 return; 28 else
29 b0=n; 30 n=m; 31 yn=ym; 32 m=a0+0.382*(b0-a0); 33 ym=fai(m); 34 count=count+1; 35 end 36 end 37 end 38 if(count>=iter) 39 disp('迭代次数超过给定次数!') ; 40 end 41 end
得到结果:
通过求导可知函数的极小值对应的t等于0,可知极小化的结果是正确的。
(皆大欢喜[]~( ̄▽ ̄)~*)
常用的函数命令
- 输入命令
- clc:清除命令行窗口
- clf :即clear figure,清楚图形窗口
- clear:清除工作区的变量,clear all是清除全部变量
- format:设置命令行窗口显示格式
- iskeyword:确认输入是否为关键字,如果没有输入,则输出全部的关键字
- who:显示当前变量名列表
- whos:显示变量详细列表
- which:查看关键字的路径
- 帮助
- help:命令行窗口中函数的帮助
- doc:帮助浏览器中的参考页
- demo:帮助浏览器中查看示例
- lookfor:在所有帮助条目中查看关键字
常用快捷键
- Ctrl+R :注释(对多行有效)
- Ctrl+T :取消注释(对多行注释有效)
- Ctrl+Z :取消上一次操作
- Ctrl+I :自动缩进(对多行有效)
- Ctrl+[ :减少缩进(对多行有效)
- Ctrl+] :增加缩进(对多行有效)
- ↑光标键 :选择最近的一次命令
- Esc:清除当前行
参考资料:
- Matlab 2016a自学一本通 /刘浩,韩晶编著 ~北京:电子工业出版社,2016,12
- Mathworks 中国,附链接 Matlab快速入门—Mtahworks中国
还没有写完,以后慢慢补吧~