一,数据结构
1.MATLAB语言的变量与常量
MATLAB语言的变量名规则:由一个字母引导,后面可以为其他字符(字母,数字,下划线)。
注意:
运算符号“+”“-”等,不属于其他符号。
因此,类似于“MyZar+”这样的变量名就是错误的。
同时,除了变量之外,MATLAB为了计算方便,提供了一些保留常量。
Eg:
pi — 表示圆周率π
eps — 表示判零的一个误差限,它的值大约是10^(-16)左右。
inf — 表示无穷大
NaN — 表示不定式,即0/0或∞/∞
2.MATLAB语言的数据结构
(1)数值型数据结构
双精度数值变量(通常使用的都是双精度数据结构):遵从IEEE标准,采用64位二进制数来表示一个数值。
其他数据类型:单精度数据结构single(),32位;uint8(),常用于图像表示和处理,8位;int8();int16();int32();
(2)符号型数据结构
符号型,sym(A),常用于公式推导和求解析解
变量声明 syms var_list var_props (定义符号型的变量)
如果有了数值A,可以通过vpa(A)把它显示出来;也可以通过sym(A)把它转换成符号型的数据结构。
显示符号变量的任何精度:vpa(A) vpa(A,n) 默认精度,32位十进制有效数字
显示符号变量的属性:assumptions()
设置符号变量类型:assume() assumeAlso()
Eg1:符号型数值与双精度数值的区别。
以1/3为例,如果采用符号型数值结构,在计算的全程中,它一直会使用1/3这样一个有理数;而用双精度数值结构,使用的值是0.333...33,保留15位有效数字(后续可能有其他数值,但是没有意义,只有前15位是有效的)。
Eg2:圆周率π。
求出π的300位有效数字。
Matlab代码 vpa(pi,300)
可以任意增加有效数字的位数。但是,随着有效数字位数的增加,运行时间会变长,位数要求过多可能无法显示。
Eg3:试用符号型数据结构表示数值12345678901234567890。
错误写法:A=sym(12345678901234567890)
正确写法:B=sym('12345678901234567890') 把数值用单引号引起来变成字符串
(3)其他数据结构
字符串型数据:用单引号括起来
多维数组:是矩阵的直接扩展,多个下标
单元数组:将不同类型数据集成到一个变量名下面,用{}表示
表格数据结构:可以定义带表头的表格
类与对象:可以定义重载函数,类与对象是“面向对象”编程的基本元素——传递函数对象
二,矩阵与向量的输入方法
1.两种基本语句结构
(1)直接赋值语句
接赋值语句的基本结构
variable=expression
一个变量名后面是表达式,表达式运算完之后将结果传给变量名。
赋值语句的末尾加一个分号可以阻止显示运算的结果。
保留变量:ans,存放最近一次无赋值变量语句的计算结果。
当赋值语句没有左边的变量,直接给出表达式,这个结果也会计算,计算结果赋给一个保留变量ans。ans里总是存放最后的运算结果。
Eg:表示矩阵
MATLAB代码:A=[1,2,3;4,5,6;7,8,9]
同样,还可以B=[1,2;4,5];
A=[[B;[7,8]],[3;6;9]]
其中,逗号表示换列,分号表示换行。
(2)函数调用语句
[returned_arguments]=function_name(input_arguments]
左边方括号里面有一些返回变量,返回的变量名之间可以用逗号也可以用空格表示。右边是函数名以及函数的输入变量。
函数调用举例 [U S V]=svd(X)
一般函数在MATLAB下都有对应的.m文件,可以通过m文件进行调用。
2.冒号表达式与子矩阵提取
冒号表达式是定义行向量的有效方法
v=s1:s2:s3;
开始于值s1,步长为值s2,终止于值s3。如果不设置的话,步长默认为1。
v1=0:0.2:pi; %%0到π之间,从0开始,间隔0.2取值
v2=linspace(0,pi,50); %%0到π之间,均匀地取50个数
3子矩阵提取
子矩阵提取的基本语句格式
B=A(v1,v2);
v1表示子矩阵要保留的行号构成的向量
v2表示要保留的列号构成的向量
:, 表示要提取所有行或列,取决于其位置
end的使用
举例:
B=A(1:2:end,:),表示以1开始,步距为2,直至最后一行(end),即把A矩阵的奇数行提取出来。并且,提取所有的列(;) 。
C=A([1,1,1,1],:) ,表示把A矩阵的第一行重复4遍,并提取所有列。
三,矩阵的代数运算
1.矩阵转置
Hermite转置 C=A'
一般转置 B=A.' (注意不要漏了.)
2.加减法运算
C=A+B
C=A-B
在新版本中,如果A是一个n*n的矩阵,B是一个n*1的列向量,也可以进行加减运算,即将列向量B加到矩阵A对应的列上。
3.矩阵乘法
C=A*B
4.矩阵除法(注意左除与右除符号的异同)
矩阵左除:求解线性方程组AX=B
MATLAB解法:X=A\B
若A为非奇异方阵,;如果A不可逆,得到的是方程的最小二乘解。最小二乘解的含义是,使得表达式最小所对应的X矩阵。
矩阵右除:求解线性方程组XA=B
MATLAB解法:X=B/A
即,若A为非奇异方阵,
5.矩阵翻转
左右翻转,B=fliplr(A)
上下翻转,B=flipud(A)
旋转90°,D=rot90(A) 注意:这里是逆时针旋转。
旋转180°,D=rot90(A,2)
6.矩阵乘方
即矩阵A的x次幂,数学表达式为:
MATLAB命令:F=a^x
这里,A为方阵,x为实数或者复数。
7.点运算
矩阵对应元素的直接计算。
C=A.*B
四,矩阵的其他运算
1.矩阵的逻辑运算
逻辑变量:非0元素表示逻辑1,0元素表示逻辑0.
逻辑运算:
与运算 A&B
或运算 A|B
非运算 B=~A
异或运算 xor(A,B)
Eg:find语句的应用。
A=[1,2,3;4,5,6;7,8,0];
i=find(A>=5)' %%原本会以列的形式输出,加了单引号后会以行的形式输出
i中输出的结果是A矩阵中满足大于等于5元素的序号。矩阵中元素的序号是按列表示的,结果中的
i =
3 5 6 8
表示矩阵按列排序所得的第三个第五个第六个第八个元素。
如果不喜欢单序号,也可以用双序号表示,即
A=[1,2,3;4,5,6;7,8,0];
[i,j]=find(A>=5)
输出结果如下所示,i表示行号,j表示列号。
2.解析结果的简化与变换
如果有一个符号表达式,可以调用simplify()进行一个自动的化简。
numden() ——把符号表达式的分子分母提取出来。
collect() ——做合并同类项处理。
expand() ——做展开处理。
factor() ——做因式分解。
Eg:多项式处理。
化简多项式
syms s;
P=(s+3)^2*(s^2+3*s+2)*(s^3+12*s^2+48*s+64);
P1=simplify(P)
多项式因式分解与展开
P3=factor(P)
P4=prod(P3)
3.变量替换
将符号表达式中的x1,替换为x1*:
f1=subs(f,x1,x1*)
将符号表达式中的若干个变量同时进行替换:
f1=subs(f,{x1,x2,...,xn},{x1*,x2*,...,xn*})
Eg:对做双线性变换。
双线性变换,即用z替换s,s=(z-1)/(z+1)。
syms s z; %%定义符号变量s和z
P=(s+3)^2*(s^2+3*s+2)*(s^3+12*s^2+48*s+64);
P1=simplify(subs(P,s,(z-1)/(z+1)))
latex(P1) %%P1表达式的Latex表示
4.常用计算函数
floor() 向下取整
ceil() 向上取整
round() 四舍五入取整
fix() 往0方向取整
k=gcd(n,m) 求最大公约数
k=gcd(n,m) 求最小公倍数
[n,d]=rat(x) 实现表达式的有理化,将分子分母提取出来
Eg:Hilbert矩阵
Hilbert矩阵可以由hilb()定义,试对一个3*3Hilbert矩阵其进行有理数变换。
A=hilb(3) %%生成3*3Hilbert矩阵
[n,d]=rat(A) %% n是分子矩阵,d是分母矩阵
Eg:全排列计算
假设5个人照集体照,共有多少种排列方式?
Matlab的perms()函数可以计算全排列,并穷举出所有排列形式。
P=perms(1:5) %%生成5个人的编号1-5,并进行排序
size(P)
调用size看出,P是一个120*5的矩阵。所有不难得出,一共有120种排列方式。
同样,也可以将5个人用ABCDE表示,对字母进行排序。
P=perms('ABCDE') %%这里一定要用单引号,表示里面是字符
size(P)
注:一定不要漏了单引号。