Alex_McAvoy

想要成为渔夫的猎手

Matlab 矩阵基础操作

【矩阵与数组】

矩阵与数组的区别:

  • 数学概念:矩阵
  • 计算机概念:数组

矩阵与数组的联系:matlab 中,矩阵是以数组形式体现的

【矩阵构造】

基本构造

利用:[] , ; 来构造

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
>> [1,2,3] % 行向量
ans =
1 2 3

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

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

>> [] % 空矩阵
ans =
[]

特殊矩阵

全 1 矩阵与全 0 矩阵
  • ones(n):构造一个 n*n 的全 1 矩阵
  • zeros(n):构造一个 n*n 的全 0 矩阵
  • ones(n,m):构造一个 n*m 的全 1 矩阵
  • zeros(n,m):构造一个 n*m 的全 0 矩阵
  • ones(n,m,...,p):构造一个 n*m*…*p 的全 1 矩阵
  • zeros(n,m,...,p):构造一个 n*m*…*p 的全 0 矩阵
  • ones(size(A)):构造一个与矩阵 A 相同大小的全 1 矩阵
  • zeres(size(A)):构造一个与矩阵 A 相同大小的全 0 矩阵
单位矩阵
  • eye(n):构造一个 n*n 的单位矩阵
  • eye(n,m):构造一个 n*m 的单位矩阵(前 n 行 n 列是一个单位矩阵,后面的 m-n 列全是0)
  • eye(size(A)):构造一个与 A 相同大小的单位矩阵
1
2
3
4
5
>> eye(3,7)
ans =
1 0 0 0 0 0 0
0 1 0 0 0 0 0
0 0 1 0 0 0 0
上三角矩阵与下三角矩阵
  • triu(A):A 的上三角矩阵
  • tril(A):A 的下三角矩阵
  • triu(A,k):以第 k 条对角线为轴的 A 的上三角矩阵,k 可取负数
  • triu(A,k):以第 k 条对角线为轴的 A 的下三角矩阵,k 可取负数
对角矩阵
  • diag(A)
    • A 为矩阵时,获取该矩阵的主对角线,返回以列向量的形式
    • A 为向量时,构造一个以该向量为主对角线的对角矩阵
  • diag(A,k)
    • A 为矩阵时,获取该矩阵的第 k 条对角线,返回以列向量的形式,k 可取负数
    • A 为向量时,构造一个以该向量为第 k 条对角线的对角矩阵,k 可取负数
块对角矩阵

blkdiag(A,B,C...):将 A、B、C… 依次合并,构造一个块对角矩阵

1
2
3
4
5
6
7
8
9
10
11
12
13
14
>> A=ones(2);
>> B=ones(3);
>> C=ones(4);
>> blkdiag(A,B,C)
ans =
1 1 0 0 0 0 0 0 0
1 1 0 0 0 0 0 0 0
0 0 1 1 1 0 0 0 0
0 0 1 1 1 0 0 0 0
0 0 1 1 1 0 0 0 0
0 0 0 0 0 1 1 1 1
0 0 0 0 0 1 1 1 1
0 0 0 0 0 1 1 1 1
0 0 0 0 0 1 1 1 1

【矩阵信息】

矩阵结构

  • isempty(A):检查 A 是否为空矩阵
  • issparse(A):检查 A 是否为稀疏矩阵
  • isvector(A):检查 A 是否为向量
  • isscalar(A):检查 A 是否为标量

矩阵维度

  • size(A):获取 A 的各维度长度
  • length(A):获取 A 的最长维度
  • numel(A):获取 A 的元素个数

【矩阵访问】

双索引(数学形式)

连续访问:

  • 基本形式:A(i:j,p:q) 从第 i 行到第 j 行,从第 p 列到第 q 列,访问组成范围内的所有元素,并生成一个新的矩阵
  • 考虑步长:A(i:step1:j,p:step2:q) 从第 i 行到第 j 行,每次步长为 step1 的所有行,从第 p 列到第 q 列,每次步长为 step2 的所有列,访问组成范围内的所有元素,并生成一个新的矩阵
  • 注意事项:
    • 行范围或列范围可以省略不写,例如:要访问 A 的第 2 列到第 4 列,可以写为 A(:,2:4)
    • 由于步长可以为负,因此当步长为负时,用 end 来表示最后一个元素,例如:要将 A 进行翻转时,可以写为 A(end:-1:1)

选取访问:

  • 基本形式:A([row1 row2 ...],[col1 col2 ...]) 选取由 row1、row2、… 这些行,与由 col1、col2、… 这些列组成范围内的所有元素,生成一个新的矩阵
  • 与连续访问组合使用:
    • 行组合:A([row1 row2 ...],p:q)
    • 列组合:A(i:j,[col1 col2 ...])

单索引(计算机存储形式)

在 matlab 中,矩阵是以数组来体现的,而数组在内存中以列优先的形式存储。

因此,要想访问矩阵中的某个元素,可以按列优先的形式,将该元素的双索引转为单索引,再进行访问。

例如:对于一个 3*3 的矩阵 A,要访问 A 中的第 2 行第 3 列的元素时,其双索引形式是 A(2,3),其单索引形式为 A(8)

双索引 A(1,1) A(2,1) A(3,1) A(1,2) A(2,2) A(3,2) A(3,1) A(3,2) A(3,3)
单索引 1 2 3 4 5 6 7 8 9
  • A(:):将矩阵按列优先的方式,组织成列向量
  • A(i:j):选取单索引从 i 到 j 的元素组织成行向量
  • A(i:step:j):选取单索引从 i 到 j 步长为 step 的元素组织成行向量
  • A([ele1 ele2 ...]):选取单索引为 ele1、ele2、… 的元素组织成行向量

单双索引转换

  • 双索引转单索引:ind=sub2ind(size(A),row,col)
  • 单索引转双索引:[row col]=ind2sub(size(A),index)

【矩阵基本操作】

  • 元素赋值:访问要赋值的元素,利用 = 赋值
  • 删除矩阵:A=[] 将矩阵 A 整体赋值为空矩阵 []
  • 删除矩阵某个元素:访问要删除的元素,将其赋值为空矩阵 []
  • 矩阵合并:
    • 按行合并(竖直方向):vertcat(A,B)cat(1,A,B) 两者等价
    • 按列合并(水平方向):horzcat(A,B)cat(2,A,B) 两者等价
  • 复制构造:repmat(A,i,j) 将矩阵 A 水平复制 i 个,竖直复制 j 个,生成一个新的矩阵

【矩阵基本运算】

加减操作(+、-)

  • 要求:维度相同,均为 n*m
  • 运算规则:
    • 无标量:对应元素逐个加减
    • 有标量:各元素逐个加减标量
  • 运算律:
    • 交换律:A+B=B+A
    • 结合律:A+(B+C)=(A+B)+C
  • 零元运算:A+0=0+A=A

乘法运算(*)

  • 标量与矩阵:各元素逐个乘标量
  • 矩阵与矩阵:
    • 要求:m*n 与 n*p 得到 m*p
    • 结果:A 中的第 i 行乘以 B 中的第 j 列得到 C 中的第(i,j)个元素
    • 运算律:
      • 分配律:A*(B+C)=A*B+A*C
      • 结合律:A*(B*C)=(A*B)*C
      • 存在性:A*E=E*A=A

除法运算(/、\)

  • 说明:矩阵没有除法,对于 A/B,其本质是对矩阵 A 求逆然后乘以 B
  • 运算符区别:
    • 左除:A/B 时,要求 A、B 列数相同
    • 右除:A\B时,要求 A、B 行数相同

幂运算(^)

  • 要求:矩阵是一个方阵
  • 本质:$A^n=A*A*…*A$(n 个 A 相乘)
  • 运算符:$A^n$,A 是一个方阵,n 是一个标量

【矩阵运算与数组运算的对比】

加减操作

  • 运算符:+、-
  • 运算结果:数组、矩阵运算结果相同

乘法运算

  • 标量与数组:.**作用相同,均是各元素逐个乘以标量
  • 数组与数组:
    • .*:两数组中对应元素相乘
    • *:即矩阵乘法

扩展:两矩阵 A、B 的点积为 dot(A,B)sum(A.*B)

除法运算

  • ./与.\
    • 标量与数组:对数组中的元素逐个进行操作
    • 数组与数组:对两数组中对应元素进行操作,要求两数组维度一致
  • /与\
    • 标量与数组:
      • 标量为除数:与 ./与.\一致
      • 标量为除数:对数组中元素逐个进行操作
    • 数组与数组:即矩阵除法

幂运算

  • .^
    • 标量与数组:对数组中的每个元素进行操作
    • 数组与数组:对两数组中对应元素进行操作,要求两数组维度一致
  • ^:即矩阵的幂运算
感谢您对我的支持,让我继续努力分享有用的技术与知识点!