【第2章】matlab程序设计基础
matlab语⾔的常量与变量
matlab语⾔的变量命名规则
由⼀个字母引导,后⾯可以为其他字符。
区分⼤⼩写如Abc ≠ ABc
matlab的保留常量
以下为系统保留常量,⾃⼰定义的变量不能与他们重名
eps  %表⽰机器的精度,其值通常在10^-16左右
i    %虚数单位,表⽰根号-1
j    %同i
pi    %表⽰常量π
NaN  %不定式,如∞/∞或者0/0的结果
Inf  %表⽰⽆穷⼤
lastwarn
lasterr
matlab语⾔的数据结构
数值型数据
matlab主要使⽤双精度的数据结构,满⾜IEEE标准,单个数值型数据⼤⼩8字节占64位。64位中有11个指数位,52个数据位,1个符号位。表⽰范围⼤概是±1.7x10^{308}。我们可以使⽤double()命令将变量转换为双精度数据结构。
扩展:其他数据类型
单精度数据结构single()32位
uint8(),常⽤于图像表⽰和处理
int8(),int16(),int32(),uint16(),uint32()
符号型数据结构
1. matlab同时还⽀持符号型的数据结构,我们可以使⽤sym(A)这个命令把数值型变量A转换为符号型数据
2. 使⽤syms声明符号变量
3. 显⽰符号变量的任何精度(前n位数值) vpa(A) vpa(A,n) ⽐如显⽰pi的前n位数值
4. 显⽰符号变量的⼀些属性 assumptions()
5. 设置符号变量类型 assume(),assumeAlso()
举个栗⼦:定义⼀个⼤于等于-1且⼩于5的实数
syms x real;
assume(x>=-1);
assumeAlso(x<5);
再以1/3的存储内容举个例⼦说明符号型数值与双精度数值的区别
再来个例⼦:使⽤符号型数据结构表⽰数值12345678901234567890(20位,双精度⽆法表⽰,需要使⽤符号型)
实际上计算机还是先将参数转变成双精度的数据类型再转变成符号型的数据,转换有偏差
错误的⽅法
正确的⽅法将参数⽤字符串表⽰,再转换为字符型
矩阵与向量的输⼊
matlab的基本语句结构
variable=expression;
将表达式运算得到的结果赋值给变量,赋值语句的结尾加分号可以阻⽌运算结果的显⽰。如果未指定变量,则表达式的值被赋予保留变量ans。
实数矩阵输⼊⽅法
复数矩阵输⼊⽅法
复数元素1+9i之间不能有空格,不然会引起歧义
函数调⽤语句
[returned_arguments] = function_name(input_arguments)
[U S V] = svd[X]  %函数调⽤举例
函数可以通过不同的⽅式被调⽤,⽐如:
内核函数,*.m函数
匿名函数,inline函数(不建议使⽤)
重载函数,私有函数等
冒号表达式
matlab下有个很重要的表达式:它是定义⾏向量的有效⽅法。例如,定义⼀个从s1到s3,间隔为s2的向量。默认间隔为1。
v = s1:s2:s3
但⽤这种⽅法时如果选择的步距不合适,那么⽣成的⾏向量可能就不会包含s3,像下⾯这种情况:
如果像同时包含s1和s3呢?可以使⽤下⾯这个命令linspace(0,pi,50),表⽰从0到pi⽣成⼀个⾏向量,中间有50个数据点。
linspace(0,pi,50)
另外,如果输⼊的布局s2为负数,显然是错误的,但matlab仍然会执⾏该语句,结果返回⼀个1x0的空
向量
⼦矩阵提取
B = A(1:2:end,:)  %提取矩阵A的奇数⾏并赋值给B
C = A([1 1 1 1],:)  %将A的第⼀⾏提取4次并赋值给C
结果如下图所⽰
矩阵的代数运算
矩阵的转置
C = A.'  %⼀般转置
C = A'  %Hermite转置
矩阵的加减法
C = A + B
C = A - B
它可以直接将两个矩阵A、B相加减。如果其中⼀个是标量,那就会把这个标量遍加/减到另⼀个矩阵上。如果矩阵维数不匹配,系统会报错。
矩阵的乘法
C = A*B
系统会⾃动检测维数是否匹配,不匹配会报错。
矩阵的除法求解线性⽅程组MATLAB解法最⼩⼆乘解
矩阵左除AX=B
X=A\B(注意除号的⽅向!)
如果原⽅程不可解则得到最⼩⼆乘解
X=A−1B
矩阵右除XA=B X=B/A
Matlab提供了两种除法运算:左除(\)和右除(/)。
⼀般情况下,x=a\b是⽅程a x =b的解,⽽x=b/a是⽅程x a=b的解。
例:a=[1 2 3; 4 2 6; 7 4 9]
b=[4; 1; 2];
x=a\b
则显⽰:x=
-1.5000
2.0000
0.5000
如果a为⾮奇异矩阵,则a\b和b/a可通过a的逆矩阵与b阵得到:
a\b = inv(a)*b
b/a = b*inv(a)
什么是奇异矩阵
⾸先,看这个矩阵是不是⽅阵(即⾏数和列数相等的矩阵。若⾏数和列数不相等,那就谈不上奇异矩阵和⾮奇异矩
阵)。然后,再看此⽅阵的⾏列式|A|是否等于0,若等于0,称矩阵A为奇异矩阵;若不等于0,称矩阵A为⾮奇异矩阵。同时,由|A|≠0可知矩阵A可逆,这样可以得出另外⼀个重要结论:可逆矩阵就是⾮奇异矩阵,⾮奇异矩阵也是可逆矩阵。 如果A为奇异矩阵,则AX=0有⽆穷解,AX=b有⽆穷解或者⽆解。如果A为⾮奇异矩阵,则AX=0有且只有唯⼀零解,AX=b有唯⼀解。
矩阵的翻转
矩阵的乘⽅
前提:矩阵为⽅阵
数学描述:
F=A x
matlab描述
F = A^x
求矩阵A的全部三次⽅⾉,并检验结果
A=123 456 780
matlab代码:
A = [1 2 3;4 5 6;7 8 0];
C = A^(1/3);  %结果可以得到⼀个复数型的三次⽅根
e = norm(A-C^3);  %所求值e为根C的误差,通常⽤⼀个范数表⽰
运⾏结果从图中可以看出,
误差是很⼩的
但实际上A还有另外两个根,如何得到呢?另外两个根可以通过这个已知根旋转得到,我们先求出旋转常数j1,然后把它乘到得到的这个个根C上就能得到另外的两个根A1 A2
[]
j1=exp(sqrt(-1)*2*pi/3)A1 = C*j1A2 = C*j1^2
norm(A-A1^3),norm(A-A2^3)
点运算
点运算是矩阵对应元素直接进⾏的运算矩阵的点乘法
C =A .∗B c ij =a ij b ij
矩阵的点乘⽅
B =A .A
b ij =a a ij ij
⽐如求矩阵A 的点乘⽅
A =1
234567
8
0A .A =112233
445566778800
=
1427256312546656823543
16777216
1
那么点运算的⽤处在哪呢?答案是可以⽤来绘制函数曲线图.⽐⽅说我们想要做⼀条y=x^2的曲线,那么我们需要先⽣成⼀个x 向量,然后对x 向量的每⼀个值单独做平⽅运算.这不正是点乘⽅运算吗?由此我们可以⽤以下代码实现
y =f (x )=x 2,y i =x 2i
x=--5:5
y=x.^2
矩阵的其他运算
矩阵的逻辑运算
与运算 A&B 或运算 A|B ⾮运算 B = ~A 异或运算 xor(A,B)
⽐较运算
各种允许的⽐较关系有:>,>=,<,<=,==,~=,find(),all(),any()解析结果的化简变换
函数simplify()⽤于数学公式的化简
s1 = simplify(s);
其他常⽤化简函数
numden() 提取表达式分⼦分母collect() 合并同类项expand() 多项式展开factor() 因式分解
例:化简多项式
[]
[][
]
P(s)=(s+3)2(s2+3s+2)(s3+12s2+48s+64) 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)    %⽤factor得到所有的公因式,再⽤prod将所有的公因数相乘
运⾏结果:
变量替换及转成Latex表⽰
将函数表达式f中的x1全部替换为x1*
f1=subs(f,x1,x∗1)
f1=subs(f,{x1,x2,⋯,x n},{x∗1,x∗2,⋯,x∗n})
应⽤举例:试⽤s=(z-1)/(z+1)对P(s)进⾏双线性变换
P(s)=(s+3)2(s2+3s+2)(s3+12s2+48s+64) syms 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)))        %得到变换后的最简形式
P3 = latex(P1)  %转为latex形式
运⾏结果
latex显⽰如下:
8z(2z+1)2(3z+1)(5z+3)3
(z+1)7
matlab基本数论运算
函数调⽤格式功能
floor()n=floor(x)向下(负⽆穷⼤)取整
ceil()n=ceil(x)向上取整
round()n=round(x)四舍五⼊取整
fix()n=fix(x)向0⽅向取整
c语言用递归函数求n的阶乘rat()[n,d]=rat(x)将有理数转化为分式
rem()B=rem(A,C)求余数
gcd()k=gcd(n,m)求最⼤公约数
lcm()k=lcm(n,m)求最⼩公倍数
factor()factor(n)因数分解
isprime()v1=isprime(v)判断是否是素数(质数)
perms()
perms(1:5)或
perms('abcde')求全排列
流程结构
利⽤matlab的流程结构,我们可以编写出复杂程序,实现更⾼级的功能。⽬前matlab⽀持的流程结构有:
循环结构
转移结构
开关结构
试探结构
matlab的循环结构
for循环结构
for i=v , 循环体 , end

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。