MATLAB 矩阵及运算


前言

相比较其他语言MATLAB 在处理矩阵和向量方面可谓功能十分强大,以下主要记录整理学习过程中一些矩阵的操作


一、矩阵的创建

1.1矩阵的创建
将矩阵的元素用方括号括起来,按矩阵行的顺序输入各元素;
同一行的元素间用逗号或空格隔开,行与行之间用分号或回车键隔开

例如:

>> a=[1, 2, 3; 4, 5, 6; 7, 8, 9]  %矩阵创建
a =

     1     2     3
     4     5     6
     7     8     9
     
>> a=[1, 2, 3]  %行向量

a =

     1     2     3

>> a=[1; 2; 3]  %列向量

a =

     1
     2
     3

1.2等间隔行向量的创建:

行向量在绘制图像,表达式运算等方面起着重要作用

1)冒号表达式

格式1  x1:dx:x2
格式2  x1:x2

说明:
初值 x1、增量 dx 和 终值 x2 分别表示开始值、步长和结束值。
增量可为负值, 省略时则默认增量为1;
当增量省略或 增量>0 而 初值>终值 时为空向量
当增量<0 而 初值<终值 时也为空向量。

2) 使用linspace生成等间隔行向量

linspace函数的格式: linspace(a,b,n)

说明:linspace函数的功能为生成从 a 到 b 之间等间隔的 n 个元素
的行向量(n的默认中为100)

两种创建方式的使用视情况而定,若需要控制向量的个数,则使用linspace函数较为方便,若需要控制一段范围的步长,则使用冒号表达式更快捷

两种创建方式如下:

t1=0:0.1:pi;
t2=linspace(0,2*pi,5);

1.3利用Matlab内部函数产生特殊矩阵

在MATLAB的elmat函数库中存在一些创建特殊矩阵的函数

函数名称 函数功能
zeros 创建零矩阵
ones 创建全一矩阵
eye 创建单位矩阵
rand 产生[0, 1]之间均匀分布的随机数
randn 产生服从标准正态分布的随机数(均值为零,标准差为1)

函数的调用格式与用法如下:

zeros(n) 产生n×n零矩阵
zeros(m,n) 产生m×n零矩阵
zeros(size(A)) 产生与矩阵A同样大小的零矩阵
t = rand 产生一个[0, 1]之间均匀分布的随机数
t = rand(3) 产生元素在[0, 1]之间均匀分布的3x3的随机数矩阵
t=rand(3,4) 产生3x4的[0, 1]之间均匀分布的随机数矩阵
t=10*rand(3,4)-5 产生[-5,5]之间均匀分布的3x4的随机矩阵
t=randn(3,4)*sqrt(5)+3 产生3x4阶均值为3,方差为5的正态分布的随机矩阵

二、矩阵的基本操作

1.矩阵元素的访问

1)向量元素的访问:
设 v 是向量,则 v(i) 表示向量 v 的第 i 个元素。
注意:Matlab中数组下标从1开始。

2)矩阵元素访问——全下标方式
A(i,j) 表示矩阵A中位于第 i 行、第 j 列的元素
例如:
A=[1, 2, 3; 4, 5, 6; 7, 8, 9]中
A( 1, 2 ) 即为 2

3)单下标方式
也可以根据矩阵元素在内存中的存储次序(序号)来引用矩阵元素

注意:在Matlab中矩阵的书写按行的顺序书写,但在内存中,按照列的顺序存储!

4)逻辑下标方式(见取子数组)

2.取子数组

同矩阵访问元素类似,在矩阵中取出子数组操作大致相同

1)全下标方式

格式:A(Rows, Cols)

得到的是一个子矩阵,其中,
Rows是由(要取的行的)行下标组成的向量(如果只取1行,则Rows 是标量)
Cols是由(要取的列的)列下标组成的向量(如果只取1列,则Cols 是标量)
“ :”出现在行下标的位置表示所有行,
“ :”出现在列下标的位置表示所有列,
end出现在行下标的位置表示最大的行下标,
end出现在列下标的位置表示最大的列下标

例如:

>>A=[1 2 3 4;5 6 7 8;9 10 11 12];
A(1,:)     %表示提取A的第1A(:,end)   %表示提取A的最后1A([3  1], :)  %表示提取A的第3行和第1行(行的顺序和A([1 3],:)不同

2)单下标方式:
通俗的来讲呢,就是将多个元素按照向量的形式取出

格式:A(S), 得到的是由A中(部分或所有)元素组成的向量

其中,S是由这些元素的单下标组成的向量
例如:

>>A=[1 2 3 4;5 6 7 8;9 10 11 12];
>>A(1:6)
ans =

     1     5     9     2     6    10

3)逻辑表达式
1.利用find函数

基本格式:indexes=find(X)

功能:返回数组X中非零元素的序号(单下标),如无非零元素,则返回空数组

格式:[I, J]=find(X), X是矩阵

功能:返回矩阵X中非零元素的行号和列号。

格式:[I, J, V]=find(X), X是矩阵

功能:返回矩阵X中非零元素的行号、列号及值

2.逻辑数组作为下标

关系表达式及逻辑表达式 的运算结果为逻辑数组,还可以用logical函数将数值数组转换为逻辑数组

格式:logical(X)

功能:将数值数组X转换为逻辑数组

这种取数组的方式通常用于筛选出数组中的特殊元素
例如:

已知A=[4,-5,0,0,4; -5,0,7,-6,0],找出A的元素中的正偶数,统计个数、并求和。

方法一:使用find()函数

A=[4,-5,0,0,4;  -5,0,7,-6,0]
xp=find(A>0 & rem(A,2)==0)   %A中正偶数的序号
yp=A(xp)                     %A中的正偶数
N=length(xp)                 % A中正偶数的个数
sum(yp)                      %A中正偶数之和 

方法二:利用逻辑数组下标

A=[4,-5,0,0,4;  -5,0,7,-6,0]
Lp =  A>0 & rem(A,2)==0
yp=A(Lp)    %A中的正偶数,也可直接写成yp=A(A>0 & rem(A,2)==0)
N=length(yp)
sum(yp)

3.矩阵元素赋值

学会子数组及矩阵元素的访问后,矩阵赋值则变得十分简单
1)全下标方式

格式:A(Rows, Cols)=B

功能:给矩阵A的部分元素赋
其中, Rows和Cols 均为标量或向量,分别指定待赋值元素所在的行和列。
当B为标量时,表示将A的指定元素均赋值为B;
当B不为标量时,要求矩阵B的行、列数必须和左边子矩阵的行、列数完全一致
需要特别注意的是 A = B 则意味着赋值后的 A 变为一个标量

2)单下标方式:

格式:A(Indexes) = B

功能:给矩阵A的部分元素赋值
其中,Indexes为标量或向量(用于指定待赋值元素的序号)
注意:当A为矩阵时,其单下标(序号)不能越界
当B为标量时,表示将A的指定元素均赋值为B;
当B不为标量时,要求B的元素个数必须等于A的待赋值的元素个数(但行列数可以不相等)

4.矩阵的拼接与扩展

矩阵拼接:
将几个矩阵放在[ ]内,
水平连接用空格或逗号隔开,

[A B] 或 [A , B] 也可以写成 horzcat(A,B)

垂直连接用分号或回车键隔开,

[A ; B] 也可以写成 vertcat(A,B)

矩阵扩展:
函数repmat

格式:repmat(A, row,col) 或repmat(A, [row,col])

功能:将矩阵A沿行和列的方向分别重复row和 col次
例如: repmat(A , 2 , 3) 和 [A A A ; A A A]相同

5.矩阵元素的删除

删除矩阵元素很简单,只有通过赋值为空([]),就可以实现删除若干行元素、若干列元素和整个数组

三、矩阵的算术运算

Matlab中的运算符及特殊符号的用法可以使用 help ops 命令查看

1.基本矩阵运算

C=A+B C=plus(A,B)
C=A-B C=minus(A,B)
累加 C=+A C=uplus(A)
累减 C=-A C=uminus(A)
乘积 C=A*B C=mtimes(A,B)
乘方 A^k mpower(A,k)
左除 A\B = inv(A)*B mldivide(A,B)
右除 A/B = A*inv(B) mrdivide(A,B)
共轭转置 A’ ctranspose(A)
非共轭转置 A.’ transpose(A)

上诉计算式,当 A为标量时,该标量与矩阵每一个元素进行运算,否则,服从线性代数运算法则

需要特别注意的是左除操作
x=A \ b 为线性方程组 A*x = b 的解
即:若要求解线性方程组
在这里插入图片描述只需以下代码即可实现:

A=[2 2 -1 1;4 3 -1 2;8 3 -3 4;3 3 -2 -2];
b=[4 6 12 6]';
x=A\b %等价于 x=inv(A)*b 

2.向量(数组)运算

在运算符 * \ / ^ 前面加.号表示数组运算(或称为点运算)

A.*B times(A,B)
C=A.\B C=ldivide(A,B) ,执行后C(i,j) = B (i,j) \ A(i,j)
C=A./B C=rdivide(A,B) ,执行后C(i,j) = B (i,j) / A(i,j)
A.^B power(A,B)

四、矩阵的关系逻辑运算

1.关系运算符

MATLAB 中关系运算符有六种:
==(eq)、~= (ne) 、 < (lt)、<= (le)、> (gt)、>= (ge)

关系运算法则:
1)当两个比较量是标量时,直接比较两数的大小。若关系成立,关系表达式结果为1,否则为0。
2)当参与比较的量是两个同型的矩阵时,比较是对两矩阵相同位置的元素按标量关系运算规则逐个进行,并给出元素比较结果。最终的关系运算的结果是一个维数与原矩阵相同的矩阵,它的元素由0或1组成。
3)当参与比较的一个是标量,而另一个是矩阵时,则把标量与矩阵的每一个元素按标量关系运算规则逐个比较,并给出元素比较结果。最终的关系运算的结果是一个维数与原矩阵相同的矩阵,它的元素由0或1组成。

2.逻辑运算符

a&b 当 a和b都非零时,运算结果为1;只要a和b中有一个为零,则结果为0.
a|b 只要a和b中有一个非零,则结果为1 (只有当a和b 都为零时,运算结果为0,否则为1)
~a 当a是零时,运算结果为1;当a非零时,运算结果为0
xor(a,b) 当a和b中恰好一个为0,另一个不为0时运算结果为1,否则为0
a && b (先决与) 当a为0时,则结果为0,而不去计算&&右边表达式的值(只有当该逻辑运算符的左边非零时,才继续执行该符号右边的运算)。
a || b (先决或) 当a为1时,则结果为1,而不去计算

(1)若参与逻辑运算的是两个同型矩阵,则对两个矩阵相同位置的元素逐对按标量规则进行逻辑运算。 最终运算结果是一个与原矩阵同型的逻辑矩阵。
(2)若参与逻辑运算的一个是标量,一个是矩阵,则分别用矩阵的每个元素和标量进行逻辑运算。最终运算结果是一个与原矩阵同型的逻辑矩阵。
(3) 逻辑非是一个单目运算。若A是一个数组,~A 对矩阵A的每个元素进行逻辑非运算,得到的结果是一个与A同型的逻辑矩阵。

五、矩阵相关函数

矩阵分析

函数 功能
inv(A) 方阵A的逆
pinv(A) 矩阵A 的广义逆(或称为伪逆)
det(A) 方阵A的行列式.
rank(A) 矩阵的秩
trace(A) 矩阵A的迹 (即主对角线元素之和 ).
poly (A) 当A是方阵时,求矩阵A的特征多项式
fliplr 用于将矩阵各列左右颠倒,
flipud 将矩阵各行上下颠倒,
rot90 将矩阵元素绕矩阵的中心逆时针旋转90度
flipdim(A,dim) 功能:将A关于第d维翻转得到B。dim=1, 对行下标进行反转; dim=2, 对列下标进行反转
any(x) 功能:1)若x是一个向量,如果x中存在非零元素,则返回1;否则,返回0。2)若x为矩阵,则分别对矩阵的每一列进行判断,最后返回一个由元素0和1组成的行向量。
all(x) 功能:(1)若x是一个向量,如果x中所有元素都非0,则返回1;否则,返回0 (2)若x为矩阵,则分别对矩阵的每一列进行判断,最后返回一个由元素0和1组成的行向量。
isempty(A) 判断A是否为空矩阵,如果是返回1,否则返回0.
isnan(A) 对于A的每个元素分别判断是否为NaN
isinf(A) 对于A的每个元素分别判断是否为无穷大(inf或者-inf)
isfinite(A) 对于A的每个元素分别判断是否为有限的值
isa(x, ‘ClassName’) 判断x是否为’ClassName’类型的数据(常量或变量),例如:isa(x,’double’)判断x是否为双精度型的变量,isnumeric(A) 判断A是否为数值型,islogical(A) 判断A是否为逻辑型,类似的还有:isfloat(A), isinteger(A),isreal(A) ,ischar(A), iscell(A), isstruct(A)等
isscalar(A) 判断A是否为标量
isvector(A) 判断A是否为向量
isrow(A) 判断A是否为行向量
iscolumn(A) 判断A是否为列向量
isequal(A,B) 如果A和B是同型的,并且数组的元素也相同,则返回1,否则返回0
exist 判断是否存在指定的变量或者文件

矩阵运算

函数 功能
expm 矩阵指数运算
logm 矩阵指数运算
sqrtm 矩阵开方运算
funm 调用函数,例如:funm(A,’exp’)或funm(A, @exp)等价于expm(A) ;funm(A,’log’) 等价于 logm(A) ; funm(A,’sqrt’) 等价于sqrtm(A)

线性代数

函数 功能
Z=null(A) Z的各列为矩阵A零空间的一组标准正交基,即:A*Z=0, Z’*Z=I 且size(Z,2)=dim(null(A)),可用于求Ax=0的基础解系
B=orth(A) 得到range(A)的一组标准正交基,即B’*B=I, 并且B和A张成相同的线性空间
rref(A) 利用高斯消元法产生矩阵A的行阶梯形矩阵(即矩阵非零行的第1个非零元素为1,且该非零元素所在列的其它元素均为零,可用于求Ax=b的解或通解)
subspace(A,B) 用于求两个子空间之间的夹角

矩阵的范数与条件数

函数 功能
norm - 求矩阵或向量的范数
normest - 估计矩阵的2范数.
normest1 - 估计矩阵的1范数.
cond - 求矩阵的条件数
rcond - 估计1范数下的条件数的倒数
condest - 估计1范数下的条件数
condeig - 计算矩阵特征值的条件数

矩阵分解

函数 功能
chol - Cholesky分解.
cholinc - 不完全Cholesky分解.
ldl - 块LDL’分解.
lu - LU 分解.
luinc - 不完全LU 分解.
qr - QR分解

特征值与奇异值分解

函数 功能
eig - 特征值分解,计算特征值问题及广义特征值问题.
svd - 奇异值分解
gsvd - 广义奇异值分解
eigs - 计算最大(或最小)的k个特征值及对应的特征向量(也可用于求广义特征值问题).
svds - 计算最大(或最小)的k个奇异值

总结

MATLAB 是一个功能强大软件,对矩阵的操作对于学习这门语言来讲更是十分重要,花了一天时间去整理相关的内容写下这篇博客,总的来说是比较枯燥繁琐的,但是写完又会感到一种成就感,对知识的掌握也更加熟练,希望之后的学习之路更加顺利吧。

猜你喜欢

转载自blog.csdn.net/qq_49288154/article/details/122208093