MATLAB
————Matrix laboratory
一般操作:
1.操作界面:主窗口,命令窗口,工作空间窗口,当前目录窗口和搜索路径
2.帮助系统: help命令 lookfor命令
help 函数名
help(‘函数名’)
lookfor 函数名 %lookfor命令更加宽松,检索所有m文件返回包含函数名的全部函数
3.注释:%这是一条注释
4.语句后加;不显示结果
5.clc 清空命令行窗口,clf 清除figure上图像

一、数据类型与变量

数据类型

数值类型:整型,浮点型
字符类型

注意:
1.MATLAB的处理对象是矩阵(可以理解为MATLAB系统实现了矩阵这种特殊数据结构,数据以矩阵形式进行存储操作——数据类型是针对矩阵元素)
2.向量和标量可以看作特殊的矩阵
3.没有布尔类型,但是以非0表示真,0表示假
4.一般情况下矩阵的元素是相同的数据类型,但是也有将不同类型的数据构成矩阵的元素的数据结构——特殊的矩阵——结构,单元矩阵

变量

变量:对象的引用,代表若干内存单元,通过变量名来对变量所引用的对象进行访问

1.命名规则: 字母开头,后接字母、下划线或数字
2.预定义变量
系统本身定义的变量,尽量避免对这些变量赋值,会覆盖原来的含义
ans——计算结果默认赋值变量
eps——机器零阈值
pi——π的近似值
i,j——虚数单位
inf,Inf——无穷大
NaN,nan——非数,如0/0,inf/inf
nargin——函数输入参数个数
nargout——函数输出参数个数

3.变量管理
命令行窗口:
内存变量的显示——who, whos(内容更详细)
内存变量的删除——clear, clear 变量名列表 (多个之间用空格隔开)

工作区窗口:编辑或删除

4.内存变量文件
利用MAT文件可以把当前MATLAB工作空间中的变量保留下来
MAT文件是一种二进制格式文件,文件后缀.mat
变量写入文件与导入matlab通过save和load命令:
save 文件名 [变量名列表]
load 文件名 [变量名列表]

当然可以通过主窗口的界面操作进行保存与导入
注:
1.文件名不需要加引号,不需要带文件后缀.mat,可以带路径
2.变量名列表中变量的个数不限,省略则默认写入/导入所有的变量,多个变量名之间用空格隔开
3.load 是覆盖的写入,要想追加,则加上 空格-append

5.数据的输出格式
数据的表示常用:日常记数法和科学记数法 1e2——10^2, e,E表示10为底的指数
数据的输出格式靠format命令来设置
format 格式符
格式符常见:short(默认的) long rat(近似有理数)

注意:
1.short输出带4位小数,不超过7位有效数字,
大于1000带小数(非0)的实数用5位有效数字的科学记数法
2.如果输出的矩阵(标量是特殊的矩阵)的每个元素数值是整的,则以不带小数的纯整数格式显示
有一个不是,都是默认小数形式输出
3.每个数据元素的表示和存储都是双精度,format只影响数据的显示,不影响数据的存储

二、矩阵

介于MATLAB处理的基本对象是矩阵数据结构,即以矩阵为基本处理单元,我们重点讨论矩阵。

1.矩阵的建立
直接输入——[]括起来,同一行元素用空格或逗号隔开,不同行用分号隔开,注意合法性
M文件建立——M文件编辑,命令行输入文件名创建变量

2.冒号表达式

产生向量[ … ](特殊的矩阵)
start:step:end
省略步长,默认=1

linspace(start,end,number)与 start:(end-start)/number:end等价

3.矩阵的拆分

a、 下标(subscript)和序号(index)——按列编号
下标和序号之间可以转换——sub2ind,ind2sub
index=sub2ind(size(A),i,j)
[i,j]=ind2sub(size(A),index)
参数可以是矩阵,两个矩阵代表下标方式,一个矩阵代表序号方式
注意: 当索引大于原来矩阵的行数/列数/总编号,MATLAB会自动拓展矩阵,并且拓展后未赋值的矩阵元素置为0

A=[1,2,3;4,5,6;7,8,9];
>> A([2,4])
ans =

     4     2

>> A([1;2])

ans =

     1
     4

>> A([1,3],[1,3])

ans =

     1     3
     7     9

>>  A([1;3],[1;3])

ans =

     1     3
     7     9

b、冒号表达式
A(:,j)——第j列
A(i:i+m,:)——第i到i+m行
A(i:i+m,j:j+n)——i到i+m行j到j+n列交叉的部分
A(:)将矩阵的元素按列叠成一个列向量

end运算符可以表示某一维的末尾

c、利用空矩阵删除矩阵元素

字符串

单引号或双引号括起来的字符序列,MATLAB将字符串当作一个行向量,每个元素对应一个字符
相关函数:

1.eval(s)  %s为字符串,表示将字符串的内容当作MATLAB语句来执行
>> A

A =

     1     2     3
     4     5     6
     7     8     9

>> y='sin(A).*2+cos(A)'

y =

    'sin(A).*2+cos(A)'

>> eval(y)

ans =

    2.2232    1.4024   -0.7078
   -2.1672   -1.6342    0.4013
    2.0679    1.8332   -0.0869

注意: MATLAB中字符串的拼接不能使用+,但是由于MATLAB按ASCII码存储字符串,
所以字符串可以进行算术运算

>> 'adkj'+2

ans =

    99   102   109   108

>> 'wy'*2

ans =

   238   242

>> 'wy'^2
错误使用  ^  (line 51)
用于对矩阵求幂的维度不正确。请检查并确保矩阵为方阵并且幂为标量。要执行按元素矩阵求幂,请使用 '.^'>> ['wy';'wy']^2

ans =

       28560       29040
       28560       29040

>> 'wy'.^2

ans =

       14161       14641
2.strcat用于字符串的拼接,
strcat(s1,s2)

3.字符串类型与其他类型的转换函数
int2str
num2str
mat2str
setstr——将ASCII码值转换为对应字符
str2num

>> a=str2num('ad')

a =

     []

 
>> str2num('a')

ans =

     []

>> help str2num
str2num - 将字符数组转换为数值数组

    此 MATLAB 函数 将字符数组或字符串标量转换为数值矩阵。输入可以包含空格、逗号和分号,以指示单独的元素。如果 str2num
    不能将输入解析为数值,则返回空矩阵。

    X = str2num(chr)
    [X,tf] = str2num(chr)

    另请参阅 cast, char, hex2num, num2str, sscanf, str2double

    str2num 的参考页
    名为 str2num 的其他函数

>> num2str(1)

ans =

    '1'

>> int2str(20)

ans =

    '20'

>> mat2str(A)

ans =

    '[1 2 3;4 5 6;7 8 9]'

>> str2num('23')

ans =

    23

>> str2num('[1,2]')

ans =

     1     2

>> str2mat('2')

ans =

    '2'

>> help str2mat
str2mat - (不推荐)基于字符串构建用空白进行填补的字符数组

    此 MATLAB 函数 构成字符数组 S,其中包含字符数组 T1, T2, T3, ...

    S = str2mat(T1, T2, T3, ...)



4.strcmp - 比较字符串

    此 MATLAB 函数 比较 s1 和 s2,如果二者相同,则返回 1 (true),否则返回 0
    (false)。如果文本的大小和内容相同,则它们将视为相等。返回结果 tf 的数据类型为 logical。

    tf = strcmp(s1,s2)

>> strcmp('c','c')

ans =

  logical

   1

>> strcmp('a','c')

ans =

  logical

   0

>> strcmp('c','a')

ans =

  logical

   0

三、运算

1.算术运算+、-、*、/、\、%、^

注意: 这些算术运算是在矩阵意义下进行的,单个数据的算术运算只是一个特例
±运算规则:矩阵维数一致,对应元素±,否则出错,但是标量和矩阵可以进行运算,矩阵的每个元素和标量均进行±
乘运算规则:矩阵要可乘的,遵循矩阵乘法规则,矩阵和标量可乘,矩阵的每个元素均和标量相乘
/、\规则 B 除 A : A / B = A ∗ i n v ( B ) , A   B = i n v ( A ) ∗ B B除A:A/B=A*inv(B),A\ B=inv(A)*B BAA/B=AinvBA B=invAB,注意除数与被除数
标量可同时为除数与被除数,单独为除数,但不能单独为被除数
^规则:A ^x,要求A为方阵(标量为特例),x为标量

点运算:
.* , .\, ./, .^
矩阵的点运算,如果矩阵维数一样,则对应元素进行运算
当有标量时,标量和矩阵的每个元素进行运算

尤其乘方:
A ^x , A . ^B , A. ^x, x . ^A
A,B表示矩阵(标量,向量是特例),x为标量
当A,B不是标量时A,B需至少有一维相同,矩阵则对应元素乘方
向量与矩阵.^时,行向量时矩阵每行均与行向量对应元素乘方,列向量时,矩阵每列均与列向量对应元素乘方

>> A

A =

     1     2     3
     4     5     6
     7     8     9
>> A^2

ans =

    30    36    42
    66    81    96
   102   126   150

>> A.^2

ans =

     1     4     9
    16    25    36
    49    64    81

>> A.^A

ans =

           1           4          27
         256        3125       46656
      823543    16777216   387420489

>> 2.^A

ans =

     2     4     8
    16    32    64
   128   256   512

>> A.^[1,2,3]

ans =

     1     4    27
     4    25   216
     7    64   729

>> A.^[1;2;3]

ans =

     1     2     3
    16    25    36
   343   512   729

>> A.^[1,2]
错误使用  .^ 
矩阵维度必须一致。

>> [1,2,3].^A

ans =

           1           4          27
           1          32         729
           1         256       19683

>> [1;2;3].^A

ans =

           1           1           1
          16          32          64
        2187        6561       19683

2.关系运算
<,>,=,~=,≤,≥
规则:
比较量为标量时,直接比较大小,成立返回1,否则返回0;
为同维度矩阵时,对应元素进行关系运算;
标量与矩阵则标量与矩阵的每个元素进行关系运算

3.逻辑运算
&,|,~
(&&,||只用于标量)
运算规则同关系元素类似

优先级(大体上):~单目运算符>算术运算符>关系运算符>逻辑运算符

注意:
1.涉及矩阵的运算且要的是对应元素进行运算时要注意使用点运算,尤其是和函数一起时不要忘记了
2.可以巧妙运用关系运算和逻辑元素对函数值进行分段处理

四、MATLAB常用函数

MATLAB提供的函数自变量规定为矩阵,然而运算法则是将函数逐项作用于矩阵的元素上,因而运算结果是一个与自变量同维的矩阵

sin,cos,tan,sinh,cosh,tanh
asin,acos,atan,asinh,acosh,atanh
sqrt
log——自然对数函数
log10——常用对数函数
log2——以2为底的对数函数
log_M(N)=log(M)/log(N)=log10(M)/log10(N)
exp
pow2
abs
rem,mod(模运算)
fix,round,ceil,floor(取整)
angle,real,imag,conj(复数共轭元素conjugate)
sign(符号函数)
gcd(最大公因子)
lcm(最小公倍数)
xor(异或)
find(返回非零元素的位置,给定两个接受变量得到下标索引,不给定或者给一个得到序号索引)
all 若向量的所有元素非零,则返回1(参数为矩阵的话,以列向量作为一个向量处理,返回结果是针对每列向量的一个横向量,可以指定维数转为行向量)

abs:可以求实数的绝对值,复数的模,字符串的ASCII
fix,round,ceil,floor:fix直接去掉小数部分,round四舍五入,ceil向上取整,floor向下取整
rem,mod区别在涉及负数时不一样
rem(x,y)=x-y.*fix(x./y)
mod=x-y.*floor(x./y)

size(A)——返回矩阵的行数和列数
length(A)——=max(size(A))
ndims(A)——给出A的维数
reshape(A,m,n)——在保持总元素个数不变的情况,对矩阵进行重排

>>help ndims
ndims - 数组维度数目
 此 MATLAB 函数 返回数组 A 的维数。维数总是大于等于 2。函数会忽略 size(A,dim) = 1 所针对的尾部单一维度。
    N = ndims(A)

五、矩阵分析与处理

1.特殊矩阵

a、通用的特殊矩阵:zeros,ones,eye,rand(产生0~1间均匀分布的随机矩阵),randn(产生均值为0,方差为1的标准正态分布随机矩阵)

以上函数的调用格式相差无几,以zeros为例
zeros(m)——mxm矩阵
zeros(m,n)——mxn矩阵
zeros(size(A))——和矩阵A同大小的矩阵

建立随机矩阵:
[a,b]均匀分布的n阶随机矩阵: r a n d ( n ) ∗ ( b − a ) + a rand(n)*(b-a)+a rand(n)(ba)+a
均值为μ,方差为 σ 2 \sigma^2 σ2的n阶正态分布的随机矩阵: μ + σ ∗ r a n d n ( 5 ) μ+\sigma*randn(5) μ+σrandn(5)
.
例子:
在[20,50]均匀分布的5阶随机矩阵: r a n d ( 5 ) ∗ 30 + 20 rand(5)*30+20 rand(5)30+20
均值为0.6方差为0.1的5阶正态分布的随机矩阵: 0.6 + s q r t ( 0.1 ) ∗ r a n d n ( 5 ) 0.6+sqrt(0.1)*randn(5) 0.6+sqrt(0.1)randn(5)

b、用于专门学科的特殊矩阵

1)魔方矩阵magic(n) ——n≥3
每行每列及对角线上的元素之和相等

2)范德蒙德矩阵
vander(V)生成以向量V为基础的范德蒙德矩阵

3)希尔比特矩阵
hilb(n)
矩阵元素:h_ij=1/(i+j-1)
希尔伯特矩阵是一个条件数很差的矩阵

4)帕斯卡矩阵pascal(n)
有杨辉三角组成的矩阵——副对角线元素为(x+y)^n的展开式的系数(最高次系数为向量第一分量)

5)多项式的伴随矩阵
compan(p)——p为多项式的系数()

2.矩阵的结构变换

a、对角阵与三角阵
对角阵——除对角元素外的元素均为0,当对角元素相等时称为数量矩阵,特殊地,当对角线元素均为1时为单位矩阵

——提取矩阵对角线元素:
diag(A)提取主对角线元素,产生一个min(m,n)的列向量
diag(A,k)提取第k条对角线元素 ,k=0时为主对角线

——构造对角阵
diag(V)产生以V为主对角线元素的矩阵
diag(V,k)产生以V为第k条对角线的矩阵

三角阵——上三角(upper triangle),下三角(lower triangle)
triu(A) 提取A的上三角元素构成上三角矩阵
triu(A,k) 提取A的第k条及以上的元素构成上三角
tril(A),tril(A,k) 下三角

b、转置,旋转与翻转

1)转置
A’ ——当A为复数矩阵时A’既实现了转置也实现了共轭,A.'只实现转置
transpose(A) - 转置向量或矩阵,此 MATLAB 函数 返回 A 的非共轭转置,
2)旋转
rot90(A,k)将矩阵逆时针旋转90°的k倍,k=1时可省略k
3)翻转
左右——fliplr(A)
上下——flipud(A)

c、矩阵正交化
将A的列向量组正交化存入Q:Q=orth(A),则Q’Q=I

d、LU分解

[L,U]=lu(A) %L为下三角阵或其变换形式,U为上三角阵,LU=A
[L,U,P]=lu(A) %LU=PA

3.矩阵求值

1)矩阵求逆
A^(-1)——inv(A)
当A不是方阵或者A非满秩时,A不存在逆,但是若能找到与A的转置同型的矩阵B,满足ABA=A, BAB=B,则称B为A的伪逆,也称广义逆矩阵,求伪逆pinv(A)

注意:存在逆时,矩阵的逆与伪逆一般不相等

求逆的方式解线性方程组
Ax=b
x=A\b=inv(A)*b

2)行列式
方阵A的行列式|A|——det(A)
行列式|A|等于矩阵A的特征值之积

3)秩(奇异值)——rank(A)

4)迹—— trace(A)=矩阵的对角元素之和=矩阵的特征值之和(特征方程得)

5)特征值与特征向量eigenvalue ——eig(A)

eig(A),e=eig(A)——得到A的特征值构成的列向量 [P,E]=eig(A)——A的特征向量构成P的列向量,特征值构成对角阵E
[P,E]=eig(A,‘nobalance’)——上一个为先对A进行相似变换,这个没有进行相似变换直接求特征值与特征向量

>> A

A =

     1     2     3
     4     5     6
     7     8     9
>> trace(A)

ans =

    15

>> eig(A)

ans =

   16.1168
   -1.1168
   -0.0000

>> sum(eig(A))

ans =

   15.0000

6)向量和矩阵范数——用来度量向量在某种意义下的长度

a、向量的范数
2-范数——每个分量的平方和开方
1-范数——每个分量的绝对值之和
∞-范数——分量的绝对值取最大值

n=norm(A)——2-范数,欧几里得范数
n=norm(A,inf)——∞范数
n=norm(A,-inf)——求向量元素的绝对值最小值
n=norm(A,1)——1范数,向量元素的绝对值之和

n=norm(A,p)——p范数,norm(A,2)=norm(A)

x=[1,2,6,3,2];
>> n1=norm(x,1)

n1 =

    14

>> n2=norm(x)

n2 =

    7.3485

>> ninf=norm(x,inf)

ninf =

     6

b、矩阵的范数
||A||=max ||Av||,||v||=1 这样定义的范数称为从属于向量的范数

||A||_1= 每列元素的绝对值之和中取最大值
||A||_∞=每行元素的绝对值之和中取最大值
||A||_2=sqrt(λ),λ为A’A的最大特征值
||A||_F=矩阵元素的平方和开方

norm(A)=norm(A,2)——2范数
norm(A,inf)——∞范数
norm(A,1)——1范数
norm(A,‘fro’)——F范数

>> A=[1 3 2;6 5 0;7 1 5];
>> n2=norm(A)

n2 =

   11.0975

>> n1=norm(A,1)

n1 =

    14

>> ninf=norm(A,inf)

ninf =

    13

>> nF=norm(A,'fro')

nF =

   12.2474

7)矩阵的条件数
cond_p(A)=||A||_p·||A^(-1)||_p
条件数总是大于1的,越接近1则矩阵的性能越好,反之越差

性能Ax=b,系数矩阵A的个别元素的微小扰动会引起解的很大变化——A为病态矩阵,不会引起——良性矩阵.良性与病态是相对的,条件数就是用来刻画矩阵这种性能

cond(A)——求cond_2(A)
cond(A,p)——求cond_p(A)

六、程序设计

1.M文件
————由MATLAB命令组成

根据调用方式的不同分为两类:命令文件(脚本文件);函数文件,拓展名均为.m,但是区别在于
1)命令文件没有输入参数也没有输出参数,而函数文件可以带输入和输出参数;
2)命令文件对MATLAB工作空间的变量进行操作,执行结束后变量还在,而函数文件中定义的变量是局部变量,执行完毕后这些变量会被清除
3)命令文件输入文件名可以直接运行,但是函数文件不能直接运行,需要使用调用的方式

2.程序控制结构

顺序结构
数据输入 x=input(提示信息)
数据的输出 disp

选择结构

if end

if else end

if elseif else end

switch 表达式
case 表达式1 语句1(语句组)
case 表达式2 语句2

otherwise
语句n
end

注意:
switch语句和C语言的区别较大switch后的表达式为一个字符串或者标量,case后的表达式还可以是单元矩阵,单元矩阵时,switch表达式的值等于单元矩阵某个元素时,就执行该对应case语句。执行完毕与switch后的表达式匹配的case 后的语句,则进入switch语句后面的语句

try 语句组1
catch 语句组2
end
%当语句组1中出现问题则转去执行语句组2

循环结构

for i=1:1:10 语句 end

while 语句 end

注意:在for循环体里面改变循环变量对最终的结果没有影响,因为在i=1:1:10中会被重新赋值

clear
clc
s=0;
for i=1:100
    s=s+i^2;
end
s     % 338350


clear
clc
s=0;
for i=1:100
    s=s+i^2;
    i=i+5;
end
s     % 338350

3.函数

[x,y]=f(m,n)
函数调用f(a,b)

注意:
1.函数名应该和文件名一致,否则调用时以文件名为准
2.函数参数的可调性
函数所传入参数的数目是可调的,matlab预定义变量nargin和nargout分别记录调用该参数时的输入实参和输出实参个数,我们可以根据这两个变量来决定函数进行不同的处理
3.全局变量 global 变量名 (不推荐使用)

七、符号计算

在科学研究和工程应用中,除了大量的数值计算外,还有对符号对象进行的运算,即直接对抽象的符号对象进行计算,并将得到的结果以标准的符号形式来表示。符号计算可以获得比数值计算更一般的结果。
matlab提供了一种符号数据类型,相应的运算对象称为符号对象。在进行符号运算之前要先建立符号对象,然后才可以进行符号对象的运算。

符号对象的创建

——sym函数与syms命令

%建立符号变量与符号常量
%sym函数
>> x=sym('x')  %定义符号变量
 
x =
 
x
 
>> k=sym('8')  %定义符号常量
 
k =
 
8
 
>> x+k
 
ans =
 
x + 8
 
>> whos
  Name      Size            Bytes  Class    Attributes

  ans       1x1                 8  sym                
  k         1x1                 8  sym                
  x         1x1                 8  sym        
 
 %syms命令——sym函数一次只能定义一个符号变量,使用syms命令一次可以定义多个符号变量,格式 syms a b c d...
 
>> syms x y z
>> whos
  Name      Size            Bytes  Class    Attributes

  x         1x1                 8  sym                
  y         1x1                 8  sym                
  z         1x1                 8  sym      
 

含有符号对象的表达式为符号表达式,符号对象的四则运算和数值运算一样。

符号表达式的化简
simplify(s) %s为符号表达式

符号对象的替换

y1=subs(y,x1) %用x1替换y中的默认变量
y1=subs(y,x,x1) %用x1替换y中的变量x
x是符号对象,x1可以是符号对象也可以是数值变量或表达式

>> syms x y
>> y=cos(x)
 
y =
 
cos(x)
 
>> syms z
>> y1=subs(y,z)
 
y1 =
 
cos(z)
 
>> y2=subs(y,x,2)
 
y2 =
 
cos(2)
 
>> plot(2,y2,'r*')
>> t=linspace(0,2*pi,100);
>> e=subs(y,t);
>> plot(t,e)

在这里插入图片描述

在这里插入图片描述

符号函数
符号对象在微积分中应用很多,常见的符号函数有求极限limit,求导diff,求积分int,求级数symsum,求泰勒级数——taylor,代数方程/方程组solve。
详见matlab微积分应用篇

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐