matlab入门精讲
learn_matlab_zh_CN.pdf Matlab快速入门[本文取于此书]
matlab_3d_visualize_zh_CN.pdf 三维可视化绘图
matlab_api_ref.pdf C/C++,Fortran,Java,Python API参考
matlab_creating_guis.pdf Matlab App构建
matlab_creating_plots_zh_CN.pdf 图形相关说明
matlab_data_analysis_zh_CN.pdf 数据分析说明
matlab_env_zh_CN.pdf 桌面工具和开发环境
matlab_external.pdf 提供给外部程序的接口
matlab_import_export.pdf 数据导入导出
matlab_matfile_format.pdf MAT文件格式说明
matlab_math_zh_CN.pdf 数学方面
matlab_oop.pdf Matlab面向对象程序设计
matlab_prog_zh_CN.pdf Matlab编程基础
matlab_ref_zh_CN.pdf Matlab函数参考
matlab_release_notes.pdf Matlab发行说明
matlab_ode_suite.pdf 解决常微分方程的数学软件开发套件(论文)
matlab_simax.pdf Matlab中稀疏矩阵的设计与实现(论文)
matlab_sorensen.pdf 大规模特征值计算的ARNOLDI/LANCZOS方法(论文)
[概述]
数组,一维数组。
矩阵,二维矩阵。
数阵,任何自然维度的数组。
维数,数阵维度之数量。
维度,数阵某一维的度量。维度相同,即维数和相应的维度相同。
matlab是一个数学软件,用于处理数阵,支持多线程计算。
其变量都以数阵形式处理,是可统一数式,以便于计算和表达。
其有命令和语句,可调函数,亦可存为脚本。
用之以处理数据,绘图以表之,可有助焉。
[变量]
皆可视为数阵,常用矩阵、数组、变量。
有元胞数组、字符串、字符数组、结构体、函数句柄等变量类型。
复数的虚部,用i或j表示。
全局变量,以global修饰,共享于工作区及所有函数,如:global GRAVITY
~数阵~
#矩阵创建,使用方括号创建,使用逗号或空格分隔各元素,使用分号分隔各行。
创建矩阵的另一种方法是使用ones,zeros或rand等函数。
magic(n) 生成n阶幻方矩阵
以下函数,一个参数表示生成n阶方阵,多个参数表示生成指定维度的数阵:
zeros 全为零
ones 全为一
rand 生成随机元素
randn 生成正态分布的随机元素
#矩阵索引,可以使用行列下标,也可以使用单一下标按顺序向下遍历每一列的线性索引。
#删除行或列,只需取其引用赋空值,如:X(:,2)=[] %删除X的第二列
#逻辑下标,是一个数阵,元素值true或false,设L是和X维度相同的逻辑数阵,那么X(L)就是取X中对应L元素true的组成的数组,若X为行向量,则X(L)也为行向量,否则X(L)都是列向量。
#数阵外元素取值会引发错误,而赋值则自动扩容。
#引用多个数阵元素,可以使用冒号运算符,如:A(1:3,2)
单独的冒号指定该维中的所有元素。
冒号运算符也可以start:step:end创建等距向量值。其中,step可省略,默认为1,如:1:3
#元胞数组,cell函数可以创建空的元胞数组,花括号也可以得到元胞数组,使用花括号引用其元素,如:
A=cell(2,3) %空的元胞数组
C={x sum(x) prod(prod(x))} %花括号创建的元胞数组
A{1}=C %元胞数组的元素可以是元胞数组
A{2}=C' %元胞数组可以转置
A{3}=x %也可以像矩阵那样用线性索引
A{2,2}=0 %用行列下标引用其元素
A{1,3}=5
A{2,3}=6
~字符串~
#字符串,以双引号括起之文本,其中有双引号则以两个代之。字符串string类型也是数组,支持'+'运算符,数值可以自动转为字符串。
#字符数组,单引号定义之char数组。
~结构体~
结构体,是多维matlab数组,其维度即字段,如:
S.name='小明'
S.score=83
S.grade='B+'
定义了三个字段的标量结构体,然後可以使用其数组,添加一个结构体元素,如下:
S(2)=struct('name','小王','score',70,'grade','C')
在结构体中可以使用动态字段引用其数据,格式如下:
structName.(expression) %expression值为structName中某一字段的文本
~函数句柄~
以@符号接函数名构造函数句柄,调用之如函数,亦可传参。
匿名函数,可直接以一个语句定义,如下:
f=@(arglist)expression
嵌套函数创建的函数句柄,存储了其父函数定义的变量。
[语句]
matlab区分大小写,变量名称使用前N个字符(namelengthmax返回的值)并忽略其余字符,数字使用和C语言类似。
matlab使用双精度浮点存储所有数字,当然可以用强制转换而以整数存储。
注释,'%'添加单行注释,两个'%%'之间定义程序块,使用"%{","%}"做块注释。
使用';'结束行,matlab会执行计算而不显示命令行窗口输出。
使用"..."来作表达式续行。
doc和help命令获取函数帮助文档。
type filename 显示文件内容
条件语句,格式:
if 表达式
语句
elseif 表达式
语句
else
语句
end
switch 变量名
case 匹配值
语句
case 匹配值
语句
otherwise
语句
end
循环语句,格式:
for 变量 = 数组
语句
end
while 表达式
语句
end
循环中可以用break和continue,while语句和C语言类似;for循环中,变量遍历数组元素,也可以遍历矩阵中的列向量。
return 用于函数返回。终止当前命令序列,并将控制权返回给调用函数或键盘。
使用向量化和预分配可以提高matlab运算速度。
可以使用命令语法调用函数,如:foo a b c %等同于foo('a','b','c')
[运算符]
MATLAB可以使用单一的算术运算符或函数来处理矩阵中的所有值。
使用逗号将彼此相邻的数组串联起来称为水平串联,每个数组必须具有相同的行数。同样,如果各数组具有相同的列数,则可以使用分号垂直串联。
关系运算中,"==" "~="比较实部和虚部,而">" "<" ">=" "<="忽略虚部。注:"~="是不等于运算符。
逻辑运算中,"&&" "||"具备短路功能,而"&" "|" "~"不具备。
矩阵运算:
+ - * /
\ 左除,a\b=inv(a)*b
^ 幂运算,a^(3/2)
' 复共轭转置,a'
数组运算:
+ - .* ./ 点乘和点除是对应元素乘除
.\ 逐元素左除,与"./"除数被除数位置相反
.^ 点幂运算,逐元素幂
.' 非共轭数组转置
[脚本和函数]
脚本,以其文件名调用,无输入输出参数,处理工作区数据。
edit 创建脚本文件,以m为後缀,实时脚本以mlx为後缀。
函数,定义于脚本中,其名应与文件名相同(主函数),有可变输入输出参数,处理其局部变量。函数定义如下:
function [outputs,...] = func_name(inputs,...) %某些情况可省略输入输出参数
%func_name comment %lookfor命令以显示此行
% comments %help命令显示及以上注释
func_body
end
为处理可变参数数量,函数体中可用两个值:nargin输入参数个数,nargout输出参数个数。
调用函数类似C语言,若返回多个参数则置于方括号中。调用无参函数,以其名。
函数句柄,以@符号接函数名构造函数句柄,调用之如函数,亦可传参。
quad(@fun,a,b) 以自适应Simpson积分法计算近似数值积分
quadl(@fun,a,b) 以自适应Lobatto积分法计算近似数值积分
integral(@fun,a,b) 使用全局自适应积分和默认误差容限求数值积分
匿名函数,可直接以一个语句定义,如下:
f=@(arglist)expression
局部函数,非匿名函数必须定义于文件中,而一个文件可包含多个函数,其中,一个主函数,及局部函数。
主函数可以直接调用,而局部函数只在其文件中可见。
私有函数,是特殊的主函数,位于普通脚本目录下的private子目录中,于其母目录下的脚本中可见,此外则不可见。
嵌套函数
function parent
disp('This is the parent function')
nestedfx
function nestedfx
disp('This is the nested function')
end
end
函数可嵌套,嵌套函数具有其父函数中定义的变量,其父函数亦可访问其变量以有之。
若其父函数不访问之变量,可存于多个嵌套函数中而不交互。
不可于流程控制语句中定义嵌套函数。
嵌套函数的工作区是静态的(能确定其包含的变量,而不是大小),匿名函数也是一样的。
嵌套函数创建的函数句柄,存储了其父函数定义的变量。
嵌套函数在其函数体内可见,在其父函数中可见。
[常用函数和命令]
clc 清空命令行窗口
clear 清空工作区
find函数,和逻辑下标类似,但是取元素true的索引组成数组。
数组可以作为下标,用来取矩阵中的相应元素,如:
k=find(isprime(A)) %取A中素数索引
A(k)=NaN %去掉A中素数并赋值NaN
数组创建
magic(n) 生成n阶幻方矩阵
以下函数,一个参数表示生成n阶方阵,多个参数表示生成指定维度的数阵:
zeros 全为零
ones 全为一
rand 生成随机元素
randn 生成正态分布的随机元素
线图,用plot函数绘制,可以标记轴并添加标题,如:
plot(x,y)
xlabel('x')
ylabel('y')
title('title')
通过向plot函数加入第三个参数,可以控制线的样式,如:plot(x,y,'r--') %红色虚线样式
plot函数可以一次绘制多条曲线(有多组数据作参数可绘制多条线),使用legend来标识各条曲线:
legend('y1','y2','y3')
使用axis设置坐标轴范围和纵横比:
axis([xmin xmax ymin ymax]) 设置当前坐标轴 x轴 和 y轴的限制范围
axis([xmin xmax ymin ymax zmin zmax cmin cmax]) 设置x,y,z轴的限制范围和色差范围
axis auto 自动选择所有的坐标轴限制
axis tight 将坐标范围设定为被绘制的数据范围
axis equal 使每个坐标轴具有均匀的刻度间隔
axis off 隐藏坐标轴
axis on 打开所有的坐标轴标签、刻度、背景
对不同的坐标轴限制,有xlim,ylim,zlim函数,用法和axis类似。
grid on 启用网格线
grid off 禁用网格线
绘图一般会清空图窗,要绘图到现有图窗,使用hold on,後用hold off後重新绘图。
三维绘图,有曲面图、网格图、折线图。
折线图,plot3(X,Y,Z,options) %可以有多个X、Y、Z、options参数表示多组曲线
当X、Y、Z为向量时,其对应元素构成一条三维曲线。
当X、Y、Z为矩阵时,其对应列元素绘制三维曲线,条数等于列数。
网格坐标矩阵,是一对行列长同之矩阵,每一对应行向量可绘制一条曲线,对应列向量也可绘制曲线,行向量和列向量绘制的曲线组成网格。
[X,Y]=meshgrid(x,y) %生成网格坐标矩阵,meshgrid(x)等价于meshgrid(x,x)
执行後,矩阵X之行为向量x,行数为向量y之长,Y之列为y而列数值x之长。
网格图,mesh(x,y,z,c) %绘制网格曲面
x,y,z是行列长同之矩阵,x,y是网格坐标矩阵,z是其上的高度矩阵,c用于指定不同高度上的颜色。
此外,meshz和meshc也绘制网格图,前者还绘制曲面的底座,後者还绘制曲面在z轴方向的等高线。
mesh(X,Y,Z) 绘制三维网格图
mesh(Z) 以矩阵Z中列行索引作x,y坐标,元素作z坐标,绘制三维网格图
mesh(__,C) 进一步指定边的颜色
mesh(ax,__) 绘制到指定坐标区ax中
mesh(__,Name,Value) 指定曲面属性
s=mesh(__) 得到曲面对象
曲面图,surf函数的用法和mesh是一样的。
子图,使用subplot函数在同一窗口显示多个绘图。
subplot(m,n,a) %窗口有m行n列子图,取索引a的子图进行绘制(索引a不同于矩阵线性索引,是自左向右遍历每一行的索引)。
可以简写为subplot(mna),如:subplot(221)等价于subplot(2,2,1)
format函数,控制显示数值的格式(不影响计算):
format short 单精度浮点
format short e 单精度科学计数法
format short g 单精度自适应(小数或科学计数法)
format long 双精度浮点
format long e或g
format bank 银行格式,保留两位小数
format rat 有理数格式,显示最接近的有理数
format hex 十六进制形式,在内存中的数据
format compact 不显示输出中出现的多个空行
矩阵张量积:kron(X,Y)=[X(i,j)*Y],X的元素与Y相乘构成更大的矩阵。
范数:norm(x,p) % p默认为2
伪逆:pinv(A) %求伪逆,对于非奇异矩阵即求逆,对于奇异矩阵则求最小二乘解
rref(A) %对行进行化简得到阶梯型矩阵
左除和右除
mldivide A\B 对A*x=B求解,可能是最小二乘解。A接近奇异或秩亏,则给出警告信息。
mrdivide B/A 对x*A=B求解,可能是最小二乘解。A接近奇异或秩亏,则给出警告信息。
null(A) 返回A的零空间的标准正交基。
null(A,'r') 返回A的零空间的“有理”基。
求解空间:A*X=B,解空间为:X=A\B+null(A)*q, q为任一向量。
求解一组方程A*X=bn,可以使用X=A\[b1 b2 b3 ...],这其实是矩阵除法。
decomposition(A) A的分解因子对象,用于加速多次矩阵除法,decomposition(A)\b=A\b.
迭代法求解方程组,此处不列。
矩阵分解,矩阵可以分解为多个矩阵的积,有:Cholesky,LU,QR分解等。
平方根,使用sqrt函数逐元素求根;其他根,nthroot(A,n) %求n次方根
eig(A) 返回一个列向量,其中包含方阵A的特征值。也可用来返回特征值和特征向量。
log1p(x) 值log(1+x)
expm1(x) 值e^x-1
特征值与特征向量
[V,D]=eig(A) %满足A*V=V*D,其中,V是特征向量,D是特征值。
当V非奇异矩阵时,特征值可分解:A=V*D/V;
Schur分解,A=U*S*U',U是正交矩阵,S是对角线上为1×1和2×2块的块上三角矩阵,特征值根据S的对角线上块决定。
奇异值分解
对于方阵有特征值分解,而对于普通矩阵有奇异值分解:A=U*S*V',A是m×n矩阵,U是m×m矩阵,S是m×n矩阵,V是n×n矩阵。
有U'*U=I(单位矩阵)=V'*V,A*A'的特征向量组成U,A'*A的特征向量组成V,S包含的奇异值可由A*A'或A'*A的特征值开方求得。
奇异值分解并不始终可行,大型稀疏矩阵一般只需要知道几个最大的奇异值,那么可以用svds和svdsketch函数加速。
多变量数据
help datafun 获取matlab提供的数据分析函数的列表
mean(A) 对矩阵A每一列求均值
std(A) 对矩阵A每一列求标准差
median(A) 对矩阵A每一列求中位数
mode(A) 对矩阵A每一列求众数
var(A) 对矩阵A每一列求方差
sum(A,n) 对矩阵的第n维求和,默认n为1(同一列求和,返回行向量),n为2时,同一行求和,返回列向量。
repmat(A,r1,...,rn) 返回一个多维数阵,将维度r1×...×rn的数阵元素替换为A,返回扩展後的数阵
convn(A,B) 返回A和B的n维卷积
filter(b,a,X) 使用由分子系数b和分母系数a定义的有理传递函数,对输入数据X进行滤波。和一维卷积计算方法一样,但有延迟。
scatter(x,y) 在向量x和y指定的位置创建一个散点图
scatter3(x,y,z) 创建一个三维散点图
cov(A) 协方差,矩阵A的列向量之间的协方差矩阵
corrcoef(A) 相关系数矩阵,对于向量ai,aj,其相关系数为cov(ai,aj)/sqrt(std(ai)*std(aj)).
polyfit(x,y,n) 返回点集拟合的n次多项式降幂排列的系数
一般线性回归使用矩阵除法计算即可(最小二乘法)。
fft(X,n,dim) 快速傅里叶变换
图窗窗口,绘图函数在图窗绘制,需要则自动创建一个图窗。
figure 创建一个新的图窗作为当前图窗,编号从1开始
figrue(n) 指定当前图窗的编号
多数绘图命令使用当前图窗绘制,其不会重置图窗属性。可以使用clf命令清空图窗。
clf 此命令返回图窗句柄,删除可见的绘图
clf('reset') 重置图窗
clf(fig)或clf(fig,'reset') 删除或重置fig绘图
savefig(figs,filename) 保存图窗句柄(数组)到fig格式文件
saveas(fig,filename) 将图窗fig保存到filename中,格式由文件名决定
openfig(filename) 打开图窗并返回图窗句柄
[A,map,transparency]=imread(filename,fmt,idx) %输入和输出参数都至少有一个
读取filename的图像,fmt是其格式(可不指定),idx是其(多图像文件)索引;
A是图像数据,灰度图像则为矩阵,彩色图像则为三维数组;
map是颜色图,如果有,则A存储map的索引,map存储颜色数据;
transparency是透明通道。
imshow(I,map) 显示I的图像数据,以map为颜色图
imshow(I,[low high]) 显示I的灰度图像,以值low为黑色,值high为白色
imwrite(A,map,filename,fmt) 将图像数据存储为文件,参数意义见imread
colormap 查看并设置当前颜色图(hsv是内置的颜色图数组)
alphamap 指定图窗的alphama(透明度)
colorbar 在当前坐标区或图的右侧显示一个垂直颜色栏。颜色栏显示当前颜色图并指示数据值到颜色图的映射。
alpha 向坐标区中的对象添加透明度
camlight 在照相机坐标系中创建或移动光源对象
lighting 指定光照算法
print(filename,fmt) 打印当前图窗到文件,fmt是文件格式(以'-d'开头,如'-dpng')
print('-clipboard','-dmeta') 打印当前图窗到剪切板
print(fig,...) 打印fig图窗
用于处理对象的函数:
allchild 查找指定对象的所有子级。
ancestor 查找图形对象的父级。
copyobj 复制图形对象。
delete 删除对象。
findall 查找所有图形对象(包括隐藏句柄)。
findobj 查找具有指定属性值的对象的句柄。
gca 返回当前轴的句柄。
gcf 返回当前图窗的句柄。
gco 返回当前对象的句柄。
ishandle 如果值是有效对象句柄,则为 True。
get(h) 查询图形对象属性
set(H,Name,Value) 设置图形对象属性
查找特定属性的对象
h=findobj('PropertyName',PropertyValue,...) 在根对象中查找
h=findobj(objhandles,...) 在objhandles中查找
isequal(A,B) 确定数组相等性
isempty(A,B) 确定数组是否为空
all(A) 确定所有的数组元素是为非零(或为true)
any(A) 确定任何数组元素是否为非零(或为true)
特殊函数提供常量值:
pi 圆周率
i或j 虚数单位
eps 浮点相对精度,eps=2^-52
realmin 最小浮点实数,2^-1022
realmax 最大浮点实数,(2-eps)*2^1023
Inf 无穷大
NaN 非数字
这些特殊函数可以被赋值语句覆盖,用clear命令恢复之。
help elfun %有关初等函数的列表
help specfun %有关高等函数的列表
help elmat %有关矩阵函数的列表
某些函数是内置的,如:sqrt和sin.