抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

Matlab系列教程4-矩阵,包括基本的矩阵创建、编辑和运算操作。

矩阵是由m×nm\times n个数aija_{ij}排成的mmnn列数表,记成

A=(a11a12a1na21a22a2nam1am2amn)A= \begin{pmatrix} a_{11}&a_{12}&\cdots&a_{1n}\\ a_{21}&a_{22}&\cdots&a_{2n}\\ \cdots&\cdots&\cdots&\cdots\\ a_{m1}&a_{m2}&\cdots&a_{mn} \end{pmatrix}

含有mmnn维行向量,nnmm维列向量。

矩阵创建

创建 - 直接输入

[]定义矩阵,同一行的元素用,或空格分割,不同行的元素用;或回车分割

矩阵的大小不需要预先定义,若[]中不写元素,表示空矩阵


创建 - 从文件中读取

可以将较为常用的矩阵写入.m文件,调用时直接运行该文件,即可在工作台看到相应矩阵。除此之外,可以使用load命令调用.txt等类型的文件。


创建 - 用函数生成特殊矩阵

可以用某些函数生成具有某些特点的矩阵,常用函数如下

函数 说明
eye(n) eye(m,n) eye(size(A)) 创建指定大小的单位矩阵
ones(n) ones(m,n) ones(size(A)) 创建指定大小矩阵,其中元素均为1
zeros(n) zeros(m,n) zeros(size(A)) 创建指定大小矩阵,其中元素均为0
rand(n) rand(m,n) rand(size(A)) 创建指定大小矩阵,其中元素服从[0,1][0,1]范围内的均匀分布
randn(n) randn(m,n) randn(size(A)) 创建指定大小矩阵,其中元素服从标准正态分布
compan(P) 创建系数向量为PP的多项式的伴随矩阵
diag(v) 创建以向量vv中的元素为对角线的对角阵
hilb(n) 创建一个n×nn\times n的Hilbert矩阵
magic(n) 创建一个nn阶幻方
sparse(A) 将矩阵AA转化为稀疏矩阵形式,即由AA的非零元素和下标构成稀疏矩阵SS

矩阵编辑

矩阵拼接

1
2
3
4
5
6
7
8
9
A = [1 2 3 4];
B = zeros(2);
C = ones(2);
D = [A; B C]
% D =
%
% 1 2 3 4
% 0 0 1 1
% 0 0 1 1

,或空格衔接,以实现矩阵的横向拼接,如上例中的矩阵BB与矩阵CC

;或换行衔接,以实现矩阵的纵向拼接,如上例中的矩阵AA与拼接矩阵[B C][B~C]


引用矩阵中的某些元素

对矩阵的每个维度均指定一个索引,即可引用相应的数据。

索引可以是标量(一个数)、向量(只能包含正整数)和:(表示全部)。

1
2
3
4
5
6
7
8
9
10
A = [1  2  3  4
5 6 7 8
9 10 11 12];

A(2,2) % 第2行第2列,即元素6
A(3,[2,4]) % 第3行第2和第4列,即[10 12]
A(1:3,3) % 第3列第1行至第4行,即[3;7;11]
A(3,:) % 第3行所有元素,即[9 10 11 12]
A(:,4) % 第4列所有元素,即[4;8;12]


矩阵变形

  • 变换维度:通过函数reshape(X,m,n)实现:将XX中的数据按列取出,再根据指定的维度,从左至右按列填充

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    t = 1:12;
    A = reshape(t, 2, 6)
    % A =
    % 1 3 5 7 9 11
    % 2 4 6 8 10 12

    B = reshape(A, 4, 3)
    % B =
    % 1 5 9
    % 2 6 10
    % 3 7 11
    % 4 8 12

    也可以仅指定一个维度,让函数自适应另一个维度的大小

    1
    2
    C = reshape(B, 3, []);  % 重构为3*4的矩阵
    D = reshape(C, [], 2); % 重构为6*2的矩阵
  • 旋转与翻转

    函数 说明
    rot90(X) rot90(X,k) 将矩阵XX逆时针方向旋转90o(×k)90^o(\times k)
    fliplr(X) 将矩阵XX左右翻转
    flipud(X) 将矩阵XX上下翻转
    flipdim(X,dim) dim=1时对行翻转,dim=2时对列翻转

三角阵/对角阵的抽取

提取对角线/用对角线构造对角阵

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
v = 1:3;
A = diag(v) % 生成以向量v为对角线的对角阵
% 1 0 0
% A = 0 2 0
% 0 0 3

v = diag(A) % 提取矩阵A的对角线,生成列向量
% 1
% v = 2
% 3

A = diag(v,2) % 生成以向量v为主对角线上第2条对角线的对角阵
% 0 0 1 0 0
% 0 0 0 2 0
% A = 0 0 0 0 3
% 0 0 0 0 0
% 0 0 0 0 0

v = diag(A,2) % 提取主对角线上第2条对角线,生成列向
% 1
% v = 2
% 3

提取上/下三角阵

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
A = ones(3);
tril(A) % 提取下三角阵
% 1 0 0
% 1 1 0
% 1 1 1

tril(A,1) % 从主对角线上第一条对角线开始提取下三角阵
% 1 1 0
% 1 1 1
% 1 1 1

triu(A) % 提取上三角阵
% 1 1 1
% 0 1 1
% 0 0 1

triu(A,-1) % 从主对角线下第一条对角线开始提取上三角阵
% 1 1 1
% 1 1 1
% 0 1 1

几个函数虽然功能不同,但第二个参数中对角线的定位规则一致,正数代表主对角线上的对角线,负数代表下面的对角线,提取时取闭区间


矩阵运算

加减运算

要求进行运算的矩阵形状一致(即各维度长度一致),计算时对应位置相加减即可,有交换律和结合律。

乘运算

若有三个矩阵C=A×BC=A\times B,则对矩阵CC中的任意一个元素cijc_{ij},有

cij=ai1b1j+ai2b2j++aisbsjc_{ij}=a_{i1}b_{1j}+a_{i2}b_{2j}+\cdots+a_{is}b_{sj}

( ai1ai2ais  )×( b1j   b2j      bsj  ) = (  cij    )\begin{pmatrix} ~\\ a_{i1}&a_{i2}&\cdots&a_{is}\\ ~\\ ~\\ \end{pmatrix} \times \begin{pmatrix} ~&b_{1j}&~&~\\ ~&b_{2j}&~&~\\ ~&\vdots&~&~\\ ~&b_{sj}&~&~\\ \end{pmatrix} ~=~ \begin{pmatrix} ~\\ ~&c_{ij}&~&~\\ ~\\ ~\\ \end{pmatrix}

其中矩阵AA的列数(第二维度)需要等于矩阵BB的行数(第一维度)。

矩阵乘运算不满足交换律


点乘运算

两个形状一致的矩阵,对应位相乘,得到一个形状不变的矩阵。


除法运算 - 左除

线性方程组D×X=BD\times X=B,若DD非奇异,即它的逆矩阵存在,则可解出X=inv(D)*B=D\B

条件:DD的阶数等于BB的行数。(DD非奇异表明DD是方阵)


除法运算 - 右除

线性方程组X×D=BX\times D=B,若DD非奇异,即它的逆矩阵存在,则可解出X=B*inv(D)=B/D

条件:BB的列数等于DD的阶数。

  • 除号偏向哪边,哪边要求非奇异
  • 使用除法运算解线性方程组比使用inv求逆的方法更迅速,且拥有更小的残差

常用矩阵运算函数

函数 说明
cond(A) 返回2-范数逆运算的条件数,即最大奇异值与最小奇异值之比
condest(A) 返回 1-范数条件数的下限
det(A) 返回矩阵的行列式(一个值)
eig(A) 返回矩阵的特征值/特征向量
inv(A) 返回矩阵的逆
norm(A,p) 返回矩阵的范数,p可以为1 2 Inf 'fro',不填默认为2
normest(A) 返回矩阵的2-范数,相当于norm(A,2)
rank(A) 返回矩阵的秩
orth(A) 矩阵的正交化运算,返回适用于矩阵范围的标准正交基,列数等于秩
rcond(A) 返回1-范数的逆条件数
trace(A) 返回矩阵对角线之和,即矩阵的迹
expm(A) 矩阵指数运算,每个元素aija_{ij}变为eaije^{a_{ij}}
logm(A) 矩阵对数运算,每个元素aija_{ij}变为lnaijlna_{ij}
sqrtm(A) 矩阵开方运算,返回XX使X×X=AX\times X=A
cdf2rdf 将复数对角矩阵转换成实数块对角矩阵
rsf2csf 将实数块对角矩阵转换成复数对角矩阵
rref 将矩阵转换成逐行递减的阶梯矩阵
funm 一般的矩阵函数

关于矩阵的条件数与“病态”:

矩阵的条件数用于刻画矩阵的“病态”程度,定义为:

cond(A)v=A1vAv, v=1,2,...,Fcond(A)_v=||A^{-1}||_v||A||_v,~v=1,2,...,F

它是一个不小于1的实数,当cond(A)v>>1cond(A)_v>>1时,说矩阵AA是“病态”的,反之则是“良态”的。


奇异值分解 SVD

SVD分解是指将一个m×nm\times n的矩阵AA表示为三个矩阵乘积的形式:USVTUSV^T,其中UUmm阶方阵,VVnn阶方阵,SSnn阶对角阵,其对角线元素为矩阵AA的奇异值且满足:

s1s2sr>sr+1==sn=0s_1\geq s_2\geq\cdots\geq s_r>s_{r+1}=\cdots=s_n=0

其中rr为矩阵AA的秩。

1
2
s = svd(A);  % 返回矩阵A的奇异值列向量s
[U,S,V] = svd(A); % 返回矩阵A的奇异值分解因子U、S和V

评论