MATALB作为工科生几乎都会用到的科学计算软件,大部分大学应该都会购买其版权,因此安装这个软件的人不在少数,即使它占用了15G+的存储空间。但是我发现其实很多人都不会用这个软件,因为安装的时候就是抱着 “我之后可能会用到,先装以备后用” 的心态安装MATLAB,而我当时就是这样的心态。
这两年,前前后后也接触了不少MATLAB的教程,也遇到过很多需要使用的场景,但是发现一个很严重的问题,那就是一段时间不用,之前记住的命令又忘了,于是趁着这个学期学了数学实验课,加上之前学习的一些课程,想简单地以课程为主线总结一下MATLAB的使用,以作备忘。同时穿插一些课程的知识,就当作再次复习一遍了。
之后如果接触了其他需要使用Matlab的课程,也会继续更新。
其他资料可以参考MATLAB中文论坛
本博客大部分内容来自课程《数学实验》,(少部分来自其他教程)因此本博客不作任何商用,感兴趣的同学欢迎加入MOOC的学习,这是课程链接
数学类科技应用软件包括数值计算(Number Crunching)型软件和数学分析(Math Analysis)型软件
概括来说,Matlab有五大功能:
对于非计算机专业学生来说,在很多时候,需要完成一个任务时,往往会优先选择Matlab,而不是用某一门编程语言来编程序解决,我认为一个重要的原因就在于Matlab的操作界面非常友善,编程的效率更高,易学易用。
下面对Matlab的界面做一个简单的介绍。
如果需要完成比较复杂的任务,也可以在所在的工作文件夹下,右键,新建,脚本,建立.m文件,相当于C语言里面的.c和.cpp文件,然后双击.m文件就会在命令行上方弹出编辑器窗口,拉动边界可以调整命令行和编辑器的大小,如果按住窗口上方往外拖,还可以实现编辑器单独窗口。
接下来对工具栏和菜单栏做一个简单的介绍。
这个工具栏是针对编辑器的,也就是打开编辑器就会自动弹出。这个界面主要是对代码的各种操作
新手入门时最先接触的一定是命令窗口,它最大的特点就是所见即所得,也就是在命令行中随意输入一个命令,按下回车键,即可得到其运算结果,速度非常快,如下所示:
输入“1+1”,再按下回车,即可得到运算结果2,这里ans是answer是缩写,可以认为是系统自带的一个变量,会不断更新。
需要注意的是,随着命令行的输入,在右侧工作区(参考简介中的界面图)会自动添加运算过程中出现的变量,比如此时右边就出现了一个ans的变量,并显示值为2.
注意:这些变量如果不清理会一直存在,且其值也一直保持不变,除非在命令行中对变量进行重新赋值。另外,如果变量是一个矩阵,则不会显示具体的值,而是会显示矩阵的大小。
命令行回车即显示结果,那可不可以不显示呢?当然可以,只要在最后加上一个英文的分号即可。
再介绍一些使用频率较高的基础指令:
format rat
表示运算结果用分数表示。a. 手动更改变量
如果不想通过命令修改,也可以双击变量,会自动弹出一个类似于Excel的变量界面,可以查看或修改变量。
b. 前后指令复用
当你想在命令行中反复运算一个非常复杂的表达式时,如果不想每次都重新输入一遍怎么办?可以选择复制粘贴,但MatLab提供了一个更好用的方法,那就是通过上下键选择之前输入过的指令,这也是非常常用的功能。
c. 终止当前运算
当你不小心写了一个死循环或者运行了一个庞大的数据文件发现 左下角状态栏 一直显示正忙,想要终止运行又不想关掉软件,就可以使用进程终止操作,Ctrl + C ;另外,如果想关掉Matlab。可以在命令行中输入 Exit 或 Quit ,和点右上角的叉效果相同。
编辑器窗口是用来创建.m脚本文件的,和命令行窗口的区别就像是VS Code的文本编辑和终端输入。调出的方法就是在菜单栏中点击新建即会自动弹出一个编辑器窗口:
如果选择保存,会默认保存在左侧的当前文件夹中,类似于一个工作区。
但是需要注意的是,MATLAB的脚本文件的命名也有讲究:
文件名命名要用英文字符,首字符不能是数字或下划线;
文件名不能与matlab的内部函数名相同。 m文件名的命名尽量不要是简单的英文单词,最好是由大小写英文/数字/下划线等组成。原因是简单的单词命名容易与matlab内部函数名同名,结果会出现一些莫名其妙的错误;
文件存储路径最好为英文路径。如果用带有中文的路径,某些情况下会出问题。
m文件名中不能有空格。若需要用两个或以上单词组合作为文件名,各单词必须直接连接组合(可以把每个单词首字母大写以作区分,或者使用下划线)。如random walk,应该写成RandomWalk或者Random_Walk。
以上参考链接:https://blog.csdn.net/soya_soya/article/details/8778273
那么接下来就是编程的环节了,MATLAB脚本语言非常容易上手,但凡有一点C语言或Python的基础差不多就可以了。为方便有编程基础的快速入门,这里只介绍一些和C语言中不一样的地方吧
变量的命名 :只能以字母开头(C语言还可以以下划线开头),且最多不超过19个字符。
循环结构:在MatLab中,循环不使用 { } ,而是用end表示循环的结束(不要求缩进),而且if 或while的条件不需要加 ( ) 。参考下面的例程:
/****for循环****/
for n = 1:10 //表示i从1到10逐次+1,循环十次
x(n) = sin(n*10);
end //终止for循环
/****while循环****/
x = 0;
sum = 0;
while x < 101
sum = sum + x;
x = x + 2;
end
/****if-else语句*****/
if x > 1
f = x^2 + 1;
else if x <= 0
f = x^3;
else
f = 2 * x
end
/*****switch语句******/
num = input('请输入一个数');
switch num
case -1 //注意case后面没有冒号
disp('I am a teacher.');
case 0
disp('I am a student.');
case 1
disp('You are a teacher.');
otherwise //等同于C语言中的 default
disp('You are a student.');
end
在本节的最后,补充一个小问题,那就是MATLAB界面美化的问题,不知道有没有尝试过给MATLAB更换字体,反正我是试过的,但是,虽然可以更换为自己想看的编程字体,但是往往会导致中文乱码,这是因为一般的编程字体都不支持中文字符,自然中文就会变成乱码了。因此,混合字体应运而生,这种字体可以实现英文字符和中文字符显示不一样的字体,就很nice,但目前混合字体流传最为广泛的就是 微软雅黑 + Consolas,下载可以参见这篇博客,如果安装字体之后发现MATLAB中找不到这个字体,可以参考这篇博客,另外再附上一篇教程链接: 如何制作混合字体 ,以及混合字体制作中可能遇到的问题。
a. 运算符号:
这里尤其需要注意带“.”的运算符!!!
一般来说,带“.”的运算符功能和不带“.”的运算符是一样的,但是在矩阵与矩阵之间的运算时有差别,即带“.”的运算符表示矩阵的每一个元素进行运算,而不是一般的矩阵运算(乘法),参考如下例程:
一般来说,但凡涉及到向量或者矩阵的运算,都得要考虑是不是得加点号,因为不加可能会报错或者运算结果完全不对,慎重!
b. 其他符号:
在命令行中随便输入一个a = 10,表明a是一个常数变量,而一般在求导和积分时,几乎都是用符号进行运算,因此,一般都需要在程序运行前声明必要的符号变量,语法如下所示:
x=sym(‘x’) —— 表明x是符号变量
syms x y z —— 定义多个符号变量
二者之间的区别可以参考这篇链接
syms f(x) —— 定义两个符号变量,f和x,且二者之间还有函数关系
在声明符号函数时,还可以使用inline函数:
f = inline(“x^3+5*x”) 或者 ff = inline(‘-x*sin(x^2-x-1)’, ‘x’) 如果不带引号,则其内部的变量都应已知。
有时候需要多个函数共用一个变量,就可以将变量定义为全局变量,使用指令
global
,具体用法建议使用help
查看。
使用方法是在每个函数中都要声明global val
,表示这个变量去全局变量中找,如果任何函数改动这个数值,如val = 0;
那么所有函数引用该变量得到的值都会发生改变。
说明:如果不加参数 ‘s’,则输入的内容可以参与运算,比如一个矩阵A,rand(3)等,而加上参数 ‘s’之后,输入的内容都会作为字符串返回。
这部分更详细的内容可以参考后续教程:【MATLAB】(二)使用拾遗
对于这些函数,我认为最重要的是知道MATLAB有这个函数,如果确实需要使用,可以利用help命令来查看详细文档。
“等于”和“不等于”
以这个为例,需要学会看Matlab的应用手册,比如第四行之后,函数括号里面都是用 “____” ,其实是代替前面的那些参数,不能省略。
需要了解的是,在运行Matlab时跳出的fig窗口其实自带了很多编辑图像属性的功能。只需要点开图像属性
在用MATLAB生成一张图像之后,很多时候的选择都是直接截图,但是,这样存在一个问题,那就是图像周围灰色的边框无法消除,严重影响了图像的美感:
所以,如果图像需要放到论文或者正式的文档中,建议可以按照如下操作:
这样得到的图像就是矢量图,然后直接到Word中粘贴,看到的图像的背景就是纯白的:
其他资料:
其他绘图可以参考https://ww2.mathworks.cn/products/matlab/plot-gallery.html,以及这个:https://matplotlib.org/stable/gallery/index.html。
有时候需要画带有填充的柱状图,如下图所示
这个时候就需要用到MATLAB中的fill
指令。在MATLAB中使用help
指令可以得到其简要介绍:
详细内容建议看帮助文档。