非整数要想转换成整数可以使用int8()、int16()、int32()、int64()、以及uint64()等进行转换。
下面是几种取整函数:
round()四舍五入、floor()向下取整、ceil()向上取整。
matlab默认是使用双精度浮点型,占用8个字节长度,其中第63为是符号位,0到51位表示小数部分,52位到62位表示指数部分。
可以直接采用赋值语句(i或j)产生复数,也可以使用complex(a,b),产生a为实部、b为虚部的复数。
real(z)得到实部、imag(z)得到虚部、abs(z)得到模、angle(z)得到弧度制下的角度、conj(z)得到共轭复数。
注意:format函数仅仅是改变数据的显示格式,不会改变数据的值。默认是format short,即保留小数点后四位,还有其他格式(比如显示小数点后更长的位数、分数形式以及科学计数法)可以用help命令查看文档,help format。
format rational比较常用以分数的形式显示。
true和false分别代表逻辑真和假,matlab中真假分别用1和0表示。true(3,4)表示生成一个3行4列的逻辑值数组。
可以使用logical()函数将一个数值转换成逻辑型。
在matlab中不区分字符和字符串,都用char表示,都用单引号括起来,matlab支持中文字符。
函数句柄也是一种数据类型。例如f = @cos,可以通过创建函数句柄来实现对函数的间接调用。f(3.1415)输出为:-1。
采用大括号来创建一个单元数组,如a = {'中国','China';[1,2,3,4,5],100}
单元数组支持下标索引,索引从1开始,如a{1,1}表示访问第一行第一列的元素。也可以用索引的方式为单元数组的元素赋值。
c = cell(3,4)表示创建一个单元数组,之后可以用索引的方式为单元数组的元素赋值。
celldisp(c)显示单元数组所有元素的值。
cellplot(c,'legend')可以以彩色图形的方式展示一个单元数组。
单元数组转结构体,s = cell2srtuct(c,fields,2),其中c为单元数组,fields为结构体内的成员变量名,2表示维度。用的时候可以用:help 查看具体的语法细节。
可以直接用点号来给一个结构体变量赋值,比如:str.name = 'zhang',str.age = 18;其中str为结构体变量名,也可以起其他变量名。str(1).name = 'zhang',str(2).name = 'Li';这样就创建了一个结构体数组,str为1行2列。
matlab的基本运算符包括有+、-、*、/左除(我们一般意义上的除法)、\右除(前面是除数后面是被除数)、^幂运算、‘转置。在进行矩阵运算时,前面加点表示对应元素进行运算,前面没有点号则进行矩阵的加减乘除。
关系运算符返回bool,注意matlab的不等于是~=,当关系运算符两边都是向量或矩阵时,维度必须相等,否则报错。
另外几个小技巧:
1.判断两个浮点数是否相等,因为浮点数有精度问题,直接比较容易得到错误结果,故采用abs(a-b) <1e-10的方式来进行比较。
2.筛选矩阵中满足条件的元素,result = A>0.5,矩阵A中大于0.5的元素返回1,其余是0。
与、或、非。符号表示为:&、|、~。函数表示为:and、or、not、xor异或。比如:and(1,0)返回0,or(1,0)返回1。
还有个快速逻辑与、快速逻辑或,它与上面的区别是:当判断第一个操作数可以决定整体逻辑时,不再往下进行运算,比如0&&1,当第一个操作数为0时无论后面怎么样,结果一定是0,就不往下进行运算了。
按位逻辑运算符:按位与:bitand(a,b),传入的a和b都是十进制数,先转换成二进制,再对每一位进行逻辑运算,最后得到一个二进制数,转换成十进制即为返回的结果。同样还有按位或bitor(a,b)、按位非bitnot(a)、按位异或bitxor(a,b)。
matlab中默认的常量有:
matlab变量命名规则:
方括号包裹,逗号分割表示在一行,分号分割表示另起一行。索引下标从1开始。
方括号包裹,逗号分割表示在一行,分号分割表示另起一行。索引下标从1开始。
比如:A和B是两个3行3列的矩阵
[A,B]是横向拼接,得到3行6列的矩阵
[A;B]是纵向拼接,得到6行3列的矩阵
还有几个拼接的函数:
常见的生成方法:
1.通过函数repmat(),A = repmat(B,m,n)表示将B看作单个对象,生成一个m行n列的大矩阵,A = repmat(B,m)表示将B看作单个对象,生成一个m行m列的大矩阵。
2.通过函数blkdiag(),A = blkdiag(B,C...)生成一个B、C...构成的准对角矩阵。
比如:通过函数imread()读取图片,得到图像数据的二维矩阵。
矩阵是按列来进行存储的,索引时要注意,例如:A = [1,2,3;4;5;6]。A(2)返回的是4,A(2,3)返回第2行第3列的元素6。
矩阵的下标索引支持所谓的切片操作,A(1:end,end)可以获取最后一列,运用好切片操作可以很灵活的得到分割后的矩阵。
注意:
前面讲过,主要是一些技巧
一些技巧:
介绍一些常见的判断函数函数:
size()返回二维数组的行数和列数。
length()返回一维数组的长度,如果是二维数组返回max(行数,列数)
ndims()返回数组的维数
也可以用一行命令whos来查看所有的变量,whos给出的信息很多,有类型、大小、占用字节数等等。
find()函数,括号内放逻辑表达式,返回逻辑表达式为真对应元素的下标。
find(A>0.5),返回A中大于0.5的元素所在下标,常用于给满足条件的元素进行赋值操作,非常常用。
直接find(A>0.5)返回单下标。[i,j] = find(A>0.5)返回双下标,i为行,j为列。
如果有多个下标符合,则返回的是这些下标组成的列向量。
用的最多的的是采用空矩阵[]的方法进行删除操作
A([1 3],:) = [] ,表示删除矩阵的第一行和第三行
A(:,end) = [] ,表示删除矩阵的最后一列
常用的方式是使用 ’ 来进行转置,但是如果矩阵中含有复数时,得到的其实是先转置再共轭的结果。
使用transpose(A)来进行转置,是真正的转置,即便矩阵有复数存在,也不会进行共轭操作。
rot90(A)将矩阵逆时针旋转90°
rot90(A,k)将矩阵逆时针旋转k × 90°
fliplr(A)进行左右翻转。flipud(A)进行上下翻转。
filpdim(A,1)相当于flipud(A),filpdim(A,2)相当于fliplr(A)。
B = reshape(A,m,n)实现尺寸的改变,本质分为两步,先将矩阵展开(注意是先列后行)成向量,向量再生成矩阵(仍是先列后行)。
一般来说,是升序排序。添加’descend‘可变为降序。
如果传入的是一个一维的向量,毫无疑问直接排序,如果传入的是一个二维矩阵,那么默认情况下,会按列为单位进行操作(每一列都作为一个向量进行sort,之后把这些排好序的列合成原尺寸的矩阵);若指定dim = 2即sort(A,2),则按行为单位进行操作。
sort(A,2,'descend')表示按行为单位进行操作,且降序。
sum(A)函数,对矩阵的每列求和返回一个行向量。
cumsum(A)函数。累计求和,也是按列为单位进行,返回与原来尺寸相同的矩阵。
它们都有一个dim参数,当dim值为2时,按行进行。比如:cumsum(A,2)表示以行为单位进行累计求和。
如果要求所有元素的和,则用sum(sum(A))。sum()函数,当参数为行向量或列向量时,返回行或列求和的结果。
与上面的求和类似,只不过将函数名换作prod和cumprod。
B = diff(A)以列为单位求一阶差分
B = diff(A,N)以列为单位求N阶差分
B = diff(A,N,2)以行为单位求N阶差分
通过函数det(A),来求一个方阵的行列式。
eig(A)函数。
E = eig(A):求矩阵A的全部特征值,组成向量E。
[V,D] = eig(A):方阵V的每一列为一个特征向量,方阵D为对角矩阵,对角线上的每一个元素为特征值(特征值在对角线上按照从小到大的顺序排列)。
知识拓展:前面介绍了伴随矩阵,p为多项式的系数向量,高次幂在前、低次幂在后。A = compan(p),再解得A的特征值即为多项式方程的根。
diag(A)获取矩阵A主对角线上的元素,组成一个列向量。
diag(A,k)获取矩阵A第k条对角线上的元素,组成一个列向量。主对角线k=0,之后第一条对角线指主对角线右上方的第一条对角线,第k条类似推。
上三角矩阵,对角线左下方的所有元素都为0;下三角矩阵,对角线右上方的所有元素都为0。
triu(A)获取上三角矩阵
triu(A,k)获取第k条对角线(包括)之后的上三角矩阵
tril(A)获取下三角矩阵
tril(A,k)获取第k条对角线(包括)之后的下三角矩阵
inv(A)求矩阵A的逆矩阵
pinv(A)求矩阵A的广义逆矩阵。
知识拓展:广义逆矩阵:如果A不是一个方阵或者是一个非满秩的方阵时,它没有逆矩阵,但是可以找到一个与A的转置同型的矩阵B满足
此时称B为A的伪逆,也叫广义逆矩阵。
rank(A)求矩阵A的秩
J = jordan(A),求约当标准型J。
[V,J] = jordan(A),得到的V和J满足:J = V-1*A*V
trace(A)求矩阵A的迹。
矩阵的迹等于对角线元素之和,也等于其特征值之和。
norm(A)或norm(A,2)求矩阵A的2阶范数,即矩阵的最大奇异值。
norm(A,1)求矩阵A的1阶范数,即矩阵的列向元素和的最大值。
norm(A,inf)求矩阵A的无穷阶范数,即矩阵的行向元素和的最大值。
norm(A,'fro')求矩阵A的Frobenius范数。
通过函数orth()求一个矩阵的标准正交基。
B = orth(A),矩阵B的列向量组成了矩阵A的一组标准正交基。
sqrtm(A)用于计算矩阵的平方根
logm(A)用于计算矩阵的自然对数
expm(A)用于计算矩阵的指数
funm(A,@sin)用于计算矩阵的超越函数值,第二个参数用于指定函数的句柄
有以下几种方式:
full(A)将一个稀疏矩阵转化为普通矩阵。
nnz(A)计算稀疏矩阵中非零值的个数。
spy(A)对稀疏矩阵中非零元素的分布进行图形化的显示。
issparse(A)判断一个矩阵是否为稀疏矩阵。
nonzeros(A)矩阵中非零元素值。
syones(A)将稀疏矩阵中的非零元素替换为1
对于正定矩阵,可以分解为上三角矩阵和下三角矩阵的乘积,这种分解叫做Cholesky分解。能够进行Cholesky分解的矩阵必须是正定的,矩阵的所有对角元素必须是正的,同时矩阵的非对角元素不能太大。
通过chol()函数进行矩阵的Cholesky分解。B = chol(A),则B‘*B = A。
将方阵A分解为下三角矩阵的置换矩阵L和上三角矩阵U的乘积。
[L1,U1] = lu(A)将矩阵分解为下三角矩阵的置换矩阵L1和上三角矩阵U1。A = L1*U1。
[L2,U2,P] = lu(A)将矩阵分解为下三角矩阵L2和上三角矩阵U2,以及置换矩阵P。
QR分解将一个m行n列的矩阵A分解为一个正交矩阵Q(m行m列)和一个上三角矩阵R(m行n列)的乘积。
[Q,R] = qr(A),则Q*R = A。
S = svd(A),对矩阵A进行奇异值分解,返回由奇异值组成的列向量,奇异值按照从小到大的顺序排列。
[U,S,V] = svd(A),对矩阵A进行奇异值分解,其中U和V为酉矩阵,S为一个对角矩阵,对角线元素为矩阵的奇异值的降序排列。
奇异值分解有:A = U*S*V'
A = U*S*U',矩阵A必须是方阵,U为酉矩阵,S为块对角矩阵。
[U,S] = schur(A)得到酉矩阵U和块对角矩阵S。
S = schur(A)得到块对角矩阵S。
对于任意一个n阶方阵都可以进行Hessenberg分解,分解公式为A = P*H*P',其中P是酉矩阵,H的第一子对角线下的元素均为0即H为Hessenberg矩阵。
H = hess(A),返回Hessenberg矩阵。
[P,H] = hess(A),返回P和H,满足A = P*H*P'。
多项式的系数按照降幂的次序存放在向量中,称为多项式的系数向量。
下面给出几种多项式的建立方式:
多项式求值:
多项式求根:
利用roots(p)求取多项式的根。
已知多项式的根求多项式的系数:
先定义根向量r,然后p = poly(r)转换成系数向量p。
多项式乘法:
c = conv(a,b),其中a和b分别为两个多项式的系数向量,c是相乘结果的系数向量。
多项式的导数:
多项式积分:
部分分式展开:
[r,p,k] = residue(b,a),求多项式之比b/a的部分分式展开。其中r、p、k对应的系数向量如下:
a(x)对应的多项式无重根:
a(x)对应的多项式有重根:
利用p = polyfit(x,y,n)对给定数据进行多项式拟合,x和y为数据的坐标组成的向量,n为拟合的多项式次数,返回系数向量。
拟合还可以在figure窗口下的工具栏,直接进行图形化用户操作。
利用函数interp1()进行一维多项式插值。
利用函数interpft()进行一维快速傅里叶插值。
利用函数interp2()进行二维插值,函数相关的参数,可以用help interp2 查看函数文档。
利用函数spline()进行样条插值,函数相关的参数,可以用help spline 查看函数文档。
利用函数interp3()进行三维插值。
利用函数interpn()进行高维插值。
利用limit()函数求取函数f的极限:
函数f用符号来定义,比如:
syms x f = sin(x)/x
y = limit(f,x,0)
注意:趋于无穷大时,用inf做参数。
可以通过函数trapz(x,y)来求定积分。例如:
x = 0:pi/1000:pi
y = sin(x)
trapz(x,y)
通过函数quad()进行求解:
通过函数dblquad()进行求解:
匿名函数的用法举例:
dblquad(@(x,y) x+y,0,1,0,1)
通过函数triplequad()进行求解:
dsolve()函数来求解常微分方程的符号解,其中Dy表示一阶微分项,D2y表示二阶微分项:
解常微分方程:
dsolve('Dy-y=sin(x)',x)
dsolve('Dy-y=sin(x)','y(0)=1/2',x)
dsolve('D2y=y','Dy(0) = 3','y(0)=1',x),求解二阶常微分方程。
解常微分方程组:
z = dsolve('Dx = y','Dy = -x'),再用z.x和z.y来查看求解结果。
数值解一般用的比较少,求常微分方程的数值解可用ode45(),具体参数及用法,用help ode45查看函数文档。
x = fminbnd(Fun,a,b),Fun为函数句柄,a和b为指定区间,返回的x为最小值所对应的自变量的取值。
[x,fval] = fminbnd(Fun,a,b),返回的x为最小值所对应的自变量的取值,fval为对应的函数值。
fminbnd()函数还可以指定options参数进行优化设置,并且可以显示迭代算法的计算过程,具体操作用help查看。
x = fminsearch(Fun,x0),其中需要指定一个起始点x0,返回局部最小值对应的自变量取值。
x = fminsearch(Fun,x0,options),指定options参数进行优化设置。
[x,fval] = fminsearch(Fun,x0),返回值fval为对应的函数值。
x = fzero(Fun,x0),指定一个起始点x0,返回零点对应的自变量取值,如果没有找到零点返回NAN。也可以指定一个区间x0,它是一个2维行向量。
x = fzero(Fun,x0,options),指定options参数进行优化设置。
[x,fval] = fzero(Fun,x0),返回值fval为对应的函数值。
使用syms命令,后面跟变量名,变量之间用空格隔开。
符号函数的建立方式:定义好符号变量,直接用一个变量f = 符号变量构成的表达式,这样f就是一个符号函数。
符号方程的建立方式:
一些常用的方法:
加减乘除,与普通变量相同。
查看一个符号表达式中的符号变量,使用symvar(f)。
factor(f)对符号变量多项式进行因式分解,如果不能分解返回本身。
expand(f)对符号表达式进行展开,可以展开多项式、指数、三角函数等等。
collect(f)对符号表达式中的同类项进行合并。
[a,b] = numden(f)获取符号表达式的分子和分母,a为分子,b为分母。
simplify(f)对符号表达式进行化简。
替换即求值,subs(f(x),x,2),第一个参数为符号表达式,第二个参数为替换的变量,第三个参数为替换的值,相当于求f(2)。对多个变量进行替换,用subs(f(x,y),{x,y},{3,4}),相当于求f(3,4)。
g = finverse(f),用于求一个函数的反函数。
compose(f,g),用于求复合函数,相当于f(g)。
符号矩阵中所有的元素都是符号变量,可以进行矩阵的加减乘除四则运算。
利用symsum(f,n,m)函数,进行级数求和。其中f为级数的表达式,n和m表示求第n项到第m项的和。
symsum(1/n^2,1,inf),即求
傅里叶变换:
利用fourier(f)函数进行傅里叶变换,利用ifourier()函数进行傅里叶逆变换。
拉普拉斯变换:
利用laplace()函数进行拉普拉斯变换,利用ilaplace()函数进行拉普拉斯逆变换。
Z变换:
利用ztrans()函数进行Z变换,利用iztrans()函数进行Z逆变换。
采用符号函数来进行图形绘制,图形更为圆滑一些。
fplot()函数:
ezplot()函数:
ezpolar()函数:
ezmesh()函数:ezmesh(f(x,y),domain),绘制f(x,y) 的曲面,其中domain可以是4×1向量 [xmin, xmax, ymin, ymax] 或2×1向量 [min, max](其中 min < x < max,min < y < max)。ezmesh(funx,funy,funz,[smin,smax,tmin,tmax]),用于绘制参数方程表示的曲面。
ezmeshc()函数:与ezmesh()函数用法和功能类似,只是在xOy平面多了等高线。
ezcontour()函数:与ezmesh()函数用法类似,专门用来绘制在xOy平面的等高线。
contour()函数:也可用于绘制等高线。通过指定其参数还可以标注等高线的高度。具体用法可以使用help contour来获取文档。例如:创建矩阵 X 和 Y,用于在 xOy平面中定义一个网格。将矩阵 Z 定义为该网格上方的高度。然后绘制 Z 的等高线。
代码如下:
其中meshgrid(x,y)用于生成二维坐标网格,在三维图形绘制中常用。
效果为:
ezcontourf()函数:与ezmesh()函数用法类似,专门用来绘制在xOy平面的等高线(而且与ezcontour()函数相比,图形的颜色被填充)。
ezsurf()函数:与ezmesh()函数功能和用法类似,绘制三维彩色曲面图。
ezsurfc()函数:与ezmesh()函数功能和用法类似,绘制三维彩色曲面图(带有等高线)。
在命令行窗口输入funtool来调用单变量符号函数计数器,操作简单方便。
在命令行窗口输入taylortool来调用泰勒级数逼近计数器,操作简单方便。
只有一个参数,plot(y):
两个参数,plot(x,y):
三个参数,plot(x,y,s):
多了一个s参数,它是一个字符串,用于控制线的颜色、类型、点的形状等等。比如:s = 'r-.*'表示红色的点划线,且点的形状为星号。其他的样式类型在需要的时候,通过help plot命令查看函数文档。
多个参数,plot(x1,y1,s1,x2,y2,s2...):
同时在一个坐标系内绘制多条曲线,且可指定每一条线的样式。
subplot(m,n,p):
需要在已经绘制好的图形上添加新的图形,使用hold命令:
使用axis()函数:
其他命令通过help来获取。
使用grid命令:
图形的缩放可以只沿x轴方向,这个功能有时候可能有用。使用zoom命令,有需要的时候可以使用help zoom进行查看。
使用函数polar():
拓展:在matlab中极坐标和直角坐标下的坐标可以相互转换。pol2cart()将极坐标转换为直角坐标,cart2pol()将直角坐标转换为极坐标。
有时候想把两个曲线显示在同一个坐标系内,但是由于单位长度的问题导致如果显示了其中一个就看不到另一个的变化趋势了,比如:同时绘制指数函数和正弦函数。这时就要采用双y轴来进行绘制了。使用函数plotyy()。
比如:plotyy(x,y,x,z,'plot','semilogy'),表示采用双y轴,且x和y向量采用等比例坐标系,x和z向量采用对数坐标系。
在figure窗口下的工具栏可以实现添加文字、添加箭头、设置线型等等很多操作,操作比较简单,不多赘述。
添加图形的标题:title('string')函数来进行标题设置。
坐标轴标签:xlabel('string')、ylabel('string'),分别对x轴和y轴添加标签。
添加图例:legend('s1','s2','s3'...),按照绘图的顺序,给出各个曲线的文字描述。
显示颜色条:常用于三维绘图和二维等高线绘图中,通过命令colorbar来进行添加。
添加文本框:文本用于对图形的说明,一般通过figure窗口来进行操作,因为比代码方便。
特殊图形绘制,包括柱状图、饼状图、直方图、散点图等等。
利用bar()函数:
还可以绘制水平方向的柱状图,使用函数barh(),用法与bar()函数相同。
利用pie()函数:
利用hist()函数:
利用scatter()函数:
火柴杆图常用于信号与系统中离散序列的绘制,使用stem()函数:
向量场图使用quiver()函数进行绘制:
quiver(X,Y,u,v)用于绘制向量场图,X、Y为[X,Y] = meshgrid(x,y)网格化后的两个矩阵,u、v为对应位置的向量场分量。
示例如下:计算
效果如下:
函数plot3()用法如下:
三维网格图:
常用两个函数:
另外,使用meshc()可以绘制带等高线的三维网格图、meshz()绘制带有底座的三维网格图。用法与mesh()类似。
三维曲面图:
函数surf()绘制三维曲面图:
另外,使用surfc()可以绘制带等高线的三维曲面图。
经常用于绘制旋转体,使用函数cylinder()生成坐标:
使用函数sphere()来生成球面坐标:
使用函数contour3()来绘制三维等高线:
使用函数bar3():
使用函数bar3h()绘制水平方向上的三维柱状图。
使用函数pie3():
使用方法与二维函数pie()相同,都是传一个x向量,用explode参数指出突出显示的部分。
使用函数scatter3():
scatter3(x,y,z),x、y、z为三个维度相同的向量,会以(x(i),y(i),z(i))为第i个散点的坐标,一共绘制length(x)个散点。
使用函数stem3():
stem3(x,y,z),与scatter3()函数用法一样,只不过在散点的基础上增加了火柴杆。
使用函数quiver3():
示例如下:绘制函数
效果如下:
建议在figure窗口下,用鼠标拖动来设置视角,不建议用代码操作,代码太麻烦而且机械。
利用函数mesh()绘制三维网格图时,默认隐藏三维图形中被遮挡的部分,可以使用hidden off命令来透视看到被隐藏的部分,效果如下:
使用colormap命令,具体颜色类型可以使用help colormap查看文档。
在matlab中,m文件有两种类型,脚本和函数,都是以.m作为后缀名。m文件为普通ASCLL文件,可以采用文本编辑器来编辑。
脚本文件中的变量都为全局变量,这些变量保存在matlab基本工作区中。为了避免变量名相同引起冲突,一般在脚本文件的开始使用clear all命令。
函数m文件在执行的过程中,所产生的变量一般都是局部变量,存放在函数自身的函数工作区中,不会和基本工作区里面的变量产生冲突。对于用户来说函数m文件就像一个黑匣子,只有输入和输出。注意:函数m文件的第一行,需要用function关键字来声明这个文件是函数m文件,且函数名必须与文件名相同。
声明形式为:function 输出参数 = 函数名(输入参数)
函数采用的参数传递方式为值传递,将变量或常量的值传递给函数形式参数指定的变量,函数在经过计算后,将返回值传递回基本工作区,函数工作区中的变量被清除。
在matlab中,nargin的值为输入参数的个数,nargout的值为输出参数的个数。可以用if-else语句配合这两个参数,实现不同输入参数、不同输出参数函数行为不同的效果。
最为常用,程序从上到下依次执行每条语句。
if-end语句,示例如下:
1if a >= b
2 a = b;
3end
if-else-end语句,示例如下:
xxxxxxxxxx
61%rem(a,b)函数为求余运算
2if rem(a,2)==0
3 disp('偶数');
4else
5 disp('奇数');
6end
if-elseif-else-end语句,示例如下:
xxxxxxxxxx
91x = 94;
2if x>90
3 disp('优秀');
4elseif x>80
5 disp('良好');
6elseif x>60
7 disp('及格');
8else
9 disp('不及格');
switch-end语句,示例如下:
xxxxxxxxxx
101switch x
2 case 1
3 disp('x=1');
4 case 2
5 disp('x=2');
6 case {3,4,5}
7 disp('x=3,4,5');
8 otherwise
9 disp('x为非1到5的数字');
10end
for循环语句:
x1%使用for循环
2for i = 1:10
3 x(i) = i^2;
4end
5
6%使用向量、矩阵运算
7j = 1:10;
8y = j.^2;
比较推荐用向量和矩阵运算来代替循环,因为这样计算效率比较高。
另外,循环还支持嵌套,例如:
xxxxxxxxxx
61x = zeros(5,5);
2for i = 1:5
3 for j = [1,2,3,4,5]
4 x(i,j) = i*j;
5 end
6end
while循环语句:
xxxxxxxxxx
71x = 1:10;
2i = 1;
3sum = 0;
4while i<=length(x)
5 sum = sum+i;
6 i = i+1;
7end
此外,matlab中也有break语句和continue语句,与C中用法相同,break用于退出一层循环,continue用于退出本次循环。
在每个函数m文件的第一行定义的函数就是主函数。一个函数m文件只有一个主函数,其函数名与文件名相同。
在同一个函数m文件下,主函数后面可以定义一些子函数,当主函数里面用到子函数时,可以对其进行调用。当外部的一些主函数与内部定义的子函数重名时,优先使用内部定义的子函数,这个现象也叫做函数的重载。另外注意:子函数只能被在同一个m文件下的主函数或其他子函数调用。
示例如下:
xxxxxxxxxx
121function y = mymaxmain(x1,x2)
2%主函数
3%输入x1和x2均为向量
4%返回y为标量
5y1 = mymax(x1);
6y2 = mymax(x2);
7y = max(y1,y2);
8end
9
10function z = mymax(x)
11z = max(x);
12end
匿名函数定义的语法格式为:f = @(参数列表) 返回的表达式。
匿名函数可以返回多个值,示例如下:
xxxxxxxxxx
31f = @(x) [max(x),min(x)];
2x = [1,3,5,7,9];
3f(x)
多重匿名函数,示例如下:
xxxxxxxxxx
31f = @(a,b,c)@(x) a*x^2+b*x+c;
2f1 = f(1,2,3); %f1仍为一个匿名函数,相当于f1 = @(x) x^2+2*x+3
3f1(3)
函数句柄简单理解就是一个名字,示例如下:
xxxxxxxxxx
21f = @cos;
2f(3.1415)
函数句柄有许多好处,最常用的好处就是可以配合匿名函数实现一个函数的快速定义。
在脚本执行的过程中,常用keyboard对程序进行调试。在代码运行的时候遇到keyboard,程序会进入命令行模式,此时用户可以对变量的值进行查看或修改,待点击继续后,代码恢复继续向下执行。它的相当于一个断点。例如:
xxxxxxxxxx
41a = [1,2,3;4,5,6];
2b = [2,4,6;8,10,12];
3keyboard;
4a+b
程序运行到pause语句会停止,当按任意键后,程序继续向后执行。常用于动态的画图演示。示例如下:
xxxxxxxxxx
101x = 0:0.1:2*pi;
2y = sin(x);
3figure;
4plot(x,y);
5hold on;
6for i=1:6
7 pause;
8 plot(x,sin(x+i/5));
9 hold on;
10end
使用函数binornd()产生二项分布随机数。
使用函数poissrnd()产生泊松分布随机数。
使用函数exprnd()产生指数分布随机数。
unifrnd()产生连续型均匀分布随机数。
unidrnd()产生离散型均匀分布随机数。
使用函数normrnd()产生正态分布随机数。
使用函数y = binopdf(x,n,p)产生二项分布概率密度函数。其中x=[0:1:n],得到p向量的第i个元素就是p(n=i-1)的概率。然后用plot(x,p)就能绘制出概率密度函数图。
使用函数y = poisspdf(x,lambda)产生泊松分布概率密度函数。用法与上面二项分布相同。
使用函数y = geopdf(x,p)产生参数为p的几何分布概率密度函数。
使用函数y = unidpdf(x,N)产生离散型均匀分布的概率密度函数。
使用函数y = unifpdf(x,a,b)产生[a,b]上均匀分布的概率密度函数。
使用函数y = exppdf(x,lambda),产生参数为
使用函数y = normpdf(x,mu,sigma),产生参数为
使用函数y = chi2pdf(x,nu),产生卡方分布的概率密度函数。
使用函数y = tpdf(x,nu),产生t分布的概率密度函数。
使用函数Y = fpdf(X,V1,V2),产生F分布的概率密度函数。
y = mean(x),对向量x中的元素求算术平均值。如果x为一个m×n的矩阵,对矩阵的每一列求平均值,返回1×n的向量。y = mean(x,2)对矩阵的每一行求平均值,返回m×1的向量。
y = nanmean(x),忽略NAN求算术平均值。其他用法与mean()函数相同。
y = geomean(x),计算几何平均数。
y = harmmean(x),计算调和平均数。
几何平均数:
调和平均数:
y = median(x),计算中位数。
y = nanmedian(x),忽略NAN计算中位数。
y = sort(x),对向量x的元素进行从小到大排序。如果x是一个矩阵,默认按列进行排序,y = sort(x,2)按行进行排序。指定descend从大到小排序。
y = range(x),求向量最大值与最小值之差。如果是矩阵默认按列进行,y = range(x,2)按行进行。
y = minmax(x),求向量的最小值和最大值。如果是矩阵,只能按照行进行操作。不支持2个参数。
y = mean(x),计算样本数据的期望。如果x是矩阵,则按列进行操作。
y = var(x),计算样本数据的方差。
y = std(x),计算样本数据的标准差。
注意样本数据的方差为:
[E,Var] = binostat(n,p),计算二项分布的期望和方差。
[E,Var] = unifstat(a,b),计算[a,b]上均匀分布的期望和方差。
[E,Var] = normstat(mu,sigma),计算正态分布的期望和方差。不过正态分布的期望与方差根据参数显然能看出来,一般不用这个函数求。
[E,Var] = expstat(lambda),计算指数分布的期望和方差。
[E,Var] = tstat(nu),计算t分布的期望和方差。
[E,Var] = fstat(V1,V2),计算F分布的期望和方差。
样本协方差:
使用函数S =cov(X,Y),其中X、Y为相同维度(都是向量)的样本数据,返回S为一个协方差矩阵。
如果参数只有一个矩阵X,S = cov(X),则以列为单位求取协方差矩阵,下面的X(i)代表X的第i列。即
相关系数:
使用函数corrcoef(X,Y)来进行计算,返回一个矩阵
前面介绍过柱状图、饼图、直方图等统计图的绘制,这里做一些其他的补充。
使用函数T = tabulate(X),X为一个正整数向量,返回值包含3列,第1列为正整数值,第2列为出现次数,第3列为频率。
使用函数histfit(data,n),其中data为样本数据构成的向量,n为直方图的组数。
使用函数normspec([a,b],mu,sigma),绘制参数为