【矩阵与数组】
矩阵与数组的区别:
- 数学概念:矩阵
- 计算机概念:数组
矩阵与数组的联系:matlab 中,矩阵是以数组形式体现的
【矩阵构造】
基本构造
利用:[] , ;
来构造
1 | >> [1,2,3] % 行向量 |
特殊矩阵
全 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 | >> eye(3,7) |
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 | >> A=ones(2); |
【矩阵信息】
矩阵结构
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 的第 2 列到第 4 列,可以写为
选取访问:
- 基本形式:
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)
除法运算
./与.\
:- 标量与数组:对数组中的元素逐个进行操作
- 数组与数组:对两数组中对应元素进行操作,要求两数组维度一致
/与\
:- 标量与数组:
- 标量为除数:与
./与.\
一致 - 标量为除数:对数组中元素逐个进行操作
- 标量为除数:与
- 数组与数组:即矩阵除法
- 标量与数组:
幂运算
.^
:- 标量与数组:对数组中的每个元素进行操作
- 数组与数组:对两数组中对应元素进行操作,要求两数组维度一致
^
:即矩阵的幂运算