注:此笔记为B站上台大郭彦甫老师的教学视频的笔记,链接附在下面:
 https://www.bilibili.com/video/BV1GJ41137UH?from=search&seid=2186999109437495567&spm_id_from=333.337.0.0
 此笔记比较简略,适用于对编程语言已经有一定了解(例如已经至少掌握C++/python)的同学学习。对于python的numpy/matplotlib库熟悉会对Matlab的系统操作方法有很大帮助。
Matlab入门教学
Introduction
Matlab:Matrix Laboratory
- 高级编程语言
 - 简单的可视化
 - 目标:学习使用MATLAB,写代码,解决工程问题
 
内容
Lecture 1 基本操作与矩阵
Command Line:基本功能(as计算器)
-  
Operator:±*/^()
 -  
cos,sin,ln,要用的符号自己查,matlab online help,内部search亦可
 -  
embedding functions:用变量存储计算结果,然后再对变量作用函数
 -  
matlab中新建变量无需声明类型,直接赋值即可,区分大小写没有数字
- matlab中的变量类型
 - 一般默认double,别的之后再学
 
 -  
who,whos:查看此前定义的变量/+取值
 -  
关键字:i,j,Inf,eps(非常小),NaN,ans,pi/ build-in function
 -  
把一个变量从workspace中消除:clear XXX,如果不加XXX就全都清空了
 -  
format指令:变量值显示方法,如:format+long/short/shortE/…/rat(分数)
 -  
在输入指令的时候:
- 在最后加分号:不会在该行显示计算结果
 - 按 ↑ \uparrow ↑的时候可查看上一条输入的指令
 
 
Array and Matrix
-  
行向量:a=[1 2 3 4],列向量:a=[1;2;3;4](;:换行),空向量:[]
 -  
矩阵:A=[1 2 3; 4 5 6; 7 8 9]
 -  
Indexing:索引
- a(2):第2个数(从1开始计数),A(1,2):第1行第2列
 - A(k):从上往下,从左往右数第k个;例如,A(2)=4,
可以输入列表:例如A([1 2; 3 4])=[A(1) A(2); A(3) A(4)]=[1 4; 7 2] - A([1 3], [1 3]):取第1,3行,第1,3列组成的submatrix
 
 -  
矩阵局部赋值:寻找索引之后赋值即可
 -  
colon operator:[i:k]=[i,i+1,…,k];[i:j:k]=[i,i+j,…,i+lj<=k],也可以和char混用
- 除此之外,还能表示全部的意思:A(3,:):取出矩阵A的第三行
 - 清空第三列:A(3,:)=[]
 
 -  
串联数组:[A B]:行串联 [A;B]:列串联
 
Array Manipulation
-  
矩阵基本运算:
- +;-
 - *;/(乘以逆矩阵)
 - .*:直接把每两个对应的元素乘在一起;./:同理,对应元素除在一起
 - 矩阵和实数运算:对每个元素都和该实数做运算,eg:A+/-/*//a
 - ‘:transpose,转置
 
 -  
特殊矩阵:
- eye(n):n*n单位矩阵
 - zeros(n1,n2):零矩阵
 - ones(n1,n2):纯1矩阵
 - diag([a1,…,an]):对角矩阵
 
 -  
特殊函数:
- max(A):每个列的最大元素组成的行向量
 - max(max(A)):最大元素
 - min:完全同上
 - sum(A):每个列的元素和组成的行向量;mean(A):同理
 - sort(A):把每个列按从小到大排序;sortrows(A):把行看成一个整体,按字典序排序
 - size(A):返回[行数 列数];length(A):max(行数,列数); width(A):min
 
 
Lecture 2 Matlab程序编写
Script Writing(脚本编写)
-  
New Script: 新建一个程序,独立成一个视窗;F5/运行
 -  
fx:提醒要用的function的名称
 -  
调试:
-  
注释:%,多行选中用右键command;%%XXXX%%:划分区块,可以只run一个区块
 -  
其它包括断点用法和C++一样;在端点处停止的时候可以看当前workspace的状态
 -  
选中右键:smart indent,自动缩进
 
 -  
 -  
执行
-  
Matlab是一个脚本语言:按行的顺序执行程序;否则我们就要使用structured programming,例如循环
-  
if,elseif,else; for,switch,case,otherwise; try,catch; while; break,continue,end,pause,return(和C++真的很像,但是条件判断后面要加end)
一些细节:
-  
switch xxx
case xxx
 statement
otherwise
 statement
end
 -  
for n=start:increment:end,incre=1时可以省略
end
 -  
注意在执行新程序之前先把旧的workspace清空,防止变量名干扰
 
 -  
 -  
逻辑判定:<,<=,>,>=,==,~=,&&(只有这两个和Cpp不一样)||
 -  
输出:disp()
 -  
程序加速:预分配大小(经典操作)
 -  
计时:tic/toc
 
 -  
 
 -  
 -  
Tips:
- clear all:清除原来的所有变量;close all:关闭所有图像
 - 换行号:…
 - 在command界面按ctrl+C:终止当前运行的程序
 
 
函数
-  
fuction y=name(x),x输入,y输出
 -  
local variables
 -  
新建一个脚本,在里面写上函数,然后保存到文件夹里面,就能用了
 -  
在编写函数脚本的时候注意输入是否可能是向量,如果是的话做运算的时候需要使用.*等算符
 -  
多个输入和输出:function [a1 a2 a3]=name(b1,b2,b3,b4 )
 -  
多类输入:类似C++的重载:
- nargin:判断输入的数量,如果不足可以补一个default
 - nargout:同理
 - varargin:判断输入的大小
 - varagout:同理
 
 -  
function handle:指向函数的指针:
f=@(x) exp(-2*x);:输入x,对x执行exp(-2*x)
 
Lecture 3 Variables and Data access
常用的变量类型
-  
强制类型转换:数据类型+() a=int8(10)/double(b)/…
 -  
numeric:int8, int32,…,uint8(unsigned),double
 -  
character:字母,s1=‘h’,ASCII
 -  
string:字符串,s1=‘wdnoifnow’
- 加长:s3=[s1 s2],可见字符串在mat里面的存储方式就是一个char数组
 - 字符串切片:str(4),str([1 2 4 4])等,也可以通过切片直接对str对应位置赋值
 - 注:str==‘a’会返回每个位置上是否等于a的一个逻辑数组
 - 技巧:如果要把str里面的‘a’全换成‘z’,使用str(str==‘a’)=‘z’
 
 -  
structure(结构体)
- variable.subvar=:把variable看做一个结构体
 - variable的indexing:variable(n).subvar(事实上创建variable的时候就默认是一个数组了)
 - field:subvariables的统称,操作:删除:rmfield(var,subvarname)
 
 -  
cell(阵列)
-  
在矩阵的每个单元里面放不同的数据类型,可以是矩阵
 -  
声明:{},两种用法,等价于:A(1,1)=&fewbfn
- A(1,1)={fewbfowie}
 - A{1,1}=fewfiewfoi
 
 -  
实现:构造一个指针矩阵即可
 -  
读取:A(1,1):&fewbfn; A{1,1}:fewbfn,是不一样的
数据矩阵=>cell:num2cell;分块=>cell:mat2cell
 
 -  
 -  
多维数组
-  
三维:row,col,layer三级索引,很复杂
 -  
辅助指令:cat() concatenation
A,B为待接矩阵,cat(1,A,B)=AB按行接([A;B]);cat(2,A,B)=AB按列接([A B]);cat(3,A,B)=AB按层接,以此类推
=>先建好各层的矩阵,然后按层搭建起来
 -  
reshape:把n*m的矩阵Areshape成i*j的矩阵,cell也能用
reshape(A,i,j)
 
 -  
 -  
数据类型检测:isxxx(var)
 
File Access(存储/读取文件)
-  
load&save
-  
save filename.mat (-ascii(加上则可以使用文本编辑器打开))
 -  
load data:load(‘filename.mat’,(’-ascii’加上则对应文本编辑器的格式)
 
 -  
 -  
excel files
-  
xlsread(‘excelname.xlsx’ (,’B2:D4’:指定读取范围))
但是只会读取数字部分,文字的部分会自动去掉
 -  
xlswritre(‘filename.xlsx’,variable,sheet, ‘E2:E4’(指定写入位置)),这时候可以写入字符串
 
 -  
 -  
low-level File I/O
- 读取必需品:fid(file ID)& pointer
 - fid=fopen(‘filename’,’permission’(r,w:读&写))
 - 写:fprintf(fid,’格式’,varname),其中格式与Cpp的printf要求相同
 - 检测结尾:feof(fid)
 
 
Lecture 4 绘图初阶
绘图原理
-  
电脑看不懂函数
- 基本思维:插值+平滑/分段
 
 -  
h=plot(x,y):把所有点对(xi,yi)绘制出来
做新的plot的时候会默认覆盖原来的内容,除非使用指令
hold on +hold off,则在中间的所有plot都会保留在figure上面
-  
图像的style调整:plot(x,y,’str’),str依次由以下部分组成
- Data markers:数据点的表示:‘.’,’*’,’+’,‘o’,’x’等
 - Line types:线的描绘:‘-’,’–’,’:’等
 - Color:颜色:黑k蓝b红r绿g黄y……
 
 -  
串联:plot(x,y,’bd-’,x,h,’gp:’,x,w,’ro-’,…)
 -  
legend():图标
legend(‘L1’,’L2’,’L3’):按串联顺序制造注记with name
 -  
title(), xlabel(), ylabel():给坐标轴和整个图起名字
数学符号命名:\pi or e^{-x}
插入文本:LATEX表示:‘$$\int_0^2 x2\sin(x)dx$$’,需要调用latex编译器:str=‘$$\int_02 x^2\sin(x)dx$$’,text(placex,placey,str,’Interpreter’,’latex’)
 
 -  
 -  
figure adjustment:关键:组件的调整
-  
对象:figure, axis, line (plot)
 -  
属性:font, fontsize, linewidth, axislimit, tickposition, ticklabel
 -  
在画出的图上点击Edit编辑属性即可
 -  
要提供object的handle,然后modify properities
-  
get:取出property
h=plot(x,y);get(h):取出line的性质
get(gca):取出axis的性质
 -  
set:改变property
set(gca/h, ‘propertyname’, modified value)
 -  
还可以直接在属性编辑器窗口里面改变数值,不过代码生成的图像相对比较连贯,属性编辑器比较时候做数据计算出来之后的一些微调
 
 -  
 
 -  
 -  
多图
-  
figure,plot(x,y1); figure,plot(x,y2);
 -  
注意:这时候使用gca和gcf只能传回最新的图的属性
 -  
一个figure中画多个图:
-  
subplot(m,n,x):图矩阵的row,col,第x个
 -  
axis equal:x,y间距等距
axis square:x,y跨度相等
axis normal:图看起来比较正
注:只能操作最新的
 
 -  
 
 -  
 -  
图像的存储:
-  
saveas(gcf,’filename’,’formattype’);
位图:‘jpeg’,’png’
矢量图:‘pdf’,’eps’
 
 -  
 
Lecture 5 2d&3d pictures
常用图表类型:
-  
对数图:
- x=logspace(a,b,space)
 - semilogx(x,y)(x对数),semilogy(x,y)(y对数),Loglog(x,y)(x,y都是对数)
 
 -  
双y图:
- plotyy(x,y1,x,y2)
 - 改变label:查罢
 
 -  
条形图:
- bar就完了,可以输入矩阵,得到平行条形图
 - bar(y,’stacked’)
 
 -  
fill():在一个封闭点用直线连接围成的区域内填充某个颜色
 -  
color space:RGB配色:
[R G B],0~255
 -  
imagesc()
- 色彩构成另外一个维度
 - 三维图=二维colorbar图:imagesc(z)+colorbar(颜色轴);调整色系colormap(Name), 是一个巨大的RGB数组
 
 
3D图
-  
三维曲线:plot3(x,y,z1,str1,x,y,z2,str2,…)
 -  
三维曲面:
-  
meshgrid:创建在给定范围内的x,y值,eg:[x,y]=meshgrid(a:space:b,c:space:d),返回的是两个矩阵,在对应点取得对应的数值
 -  
surf(x,y,z):用小正方形拟合曲面;mesh(x,y,z):用色块拟合曲面;contour(x,y,z):对z做切片;meshc/surfc:在下面多画一个contour
 
 -  
 -  
三维物体:
-  
view(a,b):选取某个角度看三维物体
 -  
light(‘Position’,[a,b,c]):打光位置
 -  
patch(‘Verices’,v):以矩阵v指定的位置的凸包绘制多边形
 
 -  
 
Matlab的工程应用
Lecture 1 微积分
微分
-  
多项式
- 表示:向量 p=[1 0 -2 -5]
 - 求值:polyval(a,x); a是多项式向量,x是要求值的区域,可以是向量,此时返回的结果就是一个向量
 - 求导:polyder§;积分:polyint§;乘法:conv(a,b)
 
 -  
数值微分
-  
diff():计算一个vector之间前后数值的差异
diff([1 3 5 2 1])=[2 2 -3 -1]
 -  
一列点的横坐标x,纵坐标y,则slope=diff(y)./diff(x)即为这些点之间的斜率
 -  
给定f,求f在a:h:b上的数值微分:
m=diff(f(a:h:b+h))/h
数学表示:f’(x)=diff(fx)./diff(x),这样间距可以不同
注意diff会减少一个数量,因此plot的时候横坐标应该使用x(1:end-1)
 
 -  
 -  
数值积分
-  
中点公式/梯形公式
 -  
中点公式:
- midpoint: mid=(x(1:end-1)+x(2:end))/2
 - sum(h*f(mid))
 
 -  
梯形公式:
- h*trapz(f(x)), trapz:梯形,相当于做梯形后加起来
 
 -  
Simpson:
- 1/3(f0+4f1+f2)
 
 
 -  
 
Matlab内嵌函数
-  
fuction handle(函数指针):
- 作用:在函数中作为输入,如xy_plot(input, x), 然后input @sin
 - 使用:@sin(x)=sin(x)
 
 -  
数值积分函数:integral()
-  
输入函数指针和积分区间即可
 -  
函数指针的建立:y=@x 1./(x.^3-2.*x-5);
 -  
多元积分:f=@(x,y) y.*sin(x)+x.*cos(y);
integral2(f,a,b,c,d),[a,b]是x的积分区间,[c,d]是y的积分区间
 
 -  
 
Lecture 2 方程式求根
Symbolic Approach(符号方法)
-  
定义符号变量:syms x,也就是x不是变量,而是一个符号
-  
这时候可以定义方程:y=sinx+x^2;
 -  
solve()函数:对于给定的方程求根:solve(y,x),前者是equation,后者是symbol,自动求解y=0时x的值,返回一个向量
 -  
多元方程组:syms x,y; eq1=…; eq2=…; A=solve(eq1,eq2,x,y);返回一个structure, A.x和A.y就是对应的各组解中x,y的值
 -  
含参方程组:syms x,arg1,arg2,… A=solve(eq1,…,x)(用别的参数表示x),其中equation不能直接用字符串表示(后来移除了这个功能)
 -  
含参微分:在含参数的情况下,diff(f,y/x)也能计算其微分,但是只能求偏导
 -  
含参积分:z=int(y)会求积分,但是后面的常数是随便加的,要减掉就使用z-subs(z,x,0)(在z中代入x=0)
 
 -  
 -  
数值求解
-  
f2= @(x) (1.2*x+…)
fsolve(f2,0),后面的值是猜测的初值(牛顿法,比较难收敛)
fzero(f2,0)(二分法,在f和x轴相切时解不出来)
 -  
进阶:options=optimset(‘MaxIter’,val1, ‘TolFun’, val2)
fsolve/fzero(f,initval, options),可以设定初值条件
 -  
polynomial专用:roots(polynomial vector)
 
 -  
 -  
递归
 










