Matlab 矩阵类型
创建普通矩阵
在 matlab 中,矩阵是一种很常见的数据类型。它和数学上的矩阵的定义基本一致。矩阵中的元素不一定是数字,但要求为同一类型。
直接输入矩阵
- 用中括号括起来
- 按行顺序输入
- 同一行元素用逗号或空格分隔
- 不同行的元素之间用分号分隔
A= [1,2,3;4,5,6;7,8,9]
$$ \begin{aligned} A= & \\ &\begin{matrix} 1&2&3 \\ 4&5&6 \\ 7&8&9 \\ \end{matrix} \end{aligned} $$
由已有矩阵建立
A=[1,2,3;4,5,6;7,8,9];
B=[0,0,0;0,0,0;0,0,0];
C=[A,B;B;A]
$$ \begin{aligned} C= & \\ &\begin{matrix} 1&2&3&0&0&0 \\ 4&5&6&0&0&0 \\ 7&8&9&0&0&0 \\ 0&0&0&1&2&3 \\ 0&0&0&4&5&6 \\ 0&0&0&7&8&9 \\ \end{matrix} \end{aligned} $$
通过矩阵运算
A=[1,2,3;4,5,6;7,8,9];
B=A + A * i
$$ \begin{aligned} B= & \\ &\begin{matrix} 1+i&2+2i&3+3i \\ 4+4i&5+5i&6+6i \\ 7+7i&8+8i&9+9i \\ \end{matrix} \end{aligned} $$
创建向量
向量是一种特殊的矩阵,行向量只有一行,列向量只有一列。下面的命令创建的是行向量。
冒号表达式
格式:初始值:步长:终止值
,双闭区间,即包含两个区间端点,
若步长省略,则默认步长为1
t = 0:2:6
$$ \begin{aligned} t= & \\ &\begin{matrix} 0&2&4&6 \end{matrix} \end{aligned} $$
linspace 函数
格式: linspace(start,end,n)
,当n省略时,取n=100
start
为第一个元素,end
为最后一个元素,n
是元素个数
矩阵元素的引用
通过下标引用
A(i, j)
访问矩阵第i
行第j
列的元素,可以作为表达式的左值。
这是一个左值表达式,即允许修改这个表达式的值
例如:
A(1,1)=1
表示将矩阵第1
行第1
列的元素修改为1
访问会执行下标检查
- 若修改数组元素且访问位置超过矩阵大小,则会自动扩大矩阵。
- 若读取数组元素且访问位置超过矩阵大小,则会提出得到一个错误。
- 根据matlab的语法,两个参数均可为矩阵,表示同时在这些行和列中的元素,例如:
A = reshape([1:25],5,5) % 创建 5x5 矩阵
A(2,:) % 访问第二行所有元素
A([2,3],[2,3]) = 233 % 将同时在第2,3行和第2,3列的元素修改为 233
输出:
$$ \begin{aligned} A =& \\ &\begin{matrix} 1 & 6 & 11 & 16 & 21\\ 2 & 7 & 12 & 17 & 22\\ 3 & 8 & 13 & 18 & 23\\ 4 & 9 & 14 & 19 & 24\\ 5 & 10 & 15 & 20 & 25\\ \end{matrix} \end{aligned} $$
$$ \begin{aligned} ans =& \\ &\begin{matrix} 2 & 7 & 12 & 17 & 22 \end{matrix} \end{aligned} $$
$$ \begin{aligned} A =& \\ &\begin{matrix} 1 & 6 & 11 & 16 & 21\\ 2 & 233 & 233 & 17 & 22\\ 3 & 233 & 233 & 18 & 23\\ 4 & 9 & 14 & 19 & 24\\ 5 & 10 & 15 & 20 & 25\\ \end{matrix} \end{aligned} $$
通过序号引用
A(i)
访问矩阵的第 i
个元素,也可以作为表达式的左值。序号和下标是一一对应的,对于一个mxn的矩阵,元素 (i, j)
的序号为 (j - 1) * m + 1
。
>> A = [1,2,3;4,5,6];
>> A(3)
ans =
2
若 A 是行向量或列向量,则允许通过直接修改矩阵元素的方式对矩阵扩大矩阵。
运算符与子矩阵
end
和 :
是获取子矩阵常用的两个运算符,作用是生成行向量,他们需要在访问矩阵(即有上下文)的表达式中使用,具体用法举例如下:
表达式 | 含义 |
---|---|
A(i,:) | 第i行全部元素 |
A(:,j) | 第j列全部元素 |
A(i:i+m,k:k+n) | 在第i~i+m行且在第k~k+n列中的全部元素 |
A(1:2:7,:) | 第1,3,5,7列的元素 |
A(end,:) | 矩阵最后一行的元素 |
类似矩阵的分块。
清空矩阵
将元素设为零
- 使用
zeros
函数生成零矩阵,覆盖原来的元素 - 配合使用
size
给zeros
函数传递矩阵大小参数
- 使用
将元素删除,缩减矩阵大小
- 引用相应元素后设置为
[]
- 若删除的元素不是一整行,则矩阵会变成一个行向量。
- 引用相应元素后设置为
清空矩阵有两种方式,一种是将元素设为零,另一种是删除对应元素,缩减矩阵大小。
>> A = [1:3;4:6;7:9]
A =
1 2 3
4 5 6
7 8 9
>> A(:,[1,2]) = [] % 删除 1~2 列的元素
A =
3
6
9
另一个方法是A = zeros(size(A))
更详细用法会在后面讲到。
矩阵下标和序号的相互转换
sub2ind 函数
sub2ind
将矩阵中指定元素的行、列下标转换为矩阵的序号。
>> A=[1:3;4:6]
A =
1 2 3
4 5 6
>> mSize = size(A) % 获取矩阵大小
mSize =
2 3
>> sub2ind(mSize, [1;2], [1;1]) % [1;2] 是行 [1;1] 是列
% 这个函数要求传入两个同型的矩阵
ans =
1
2
ind2sub 函数
ind2sub
将矩阵元素的序号转换为下标
>> A=[1:3;4:6]
A =
1 2 3
4 5 6
>> mSize = size(A)
mSize =
2 3
>> [I, J] = ind2sub(mSize, [1,2,4]) % [1,2,4] 元素的序号, [I, J] 分别为矩阵元素的行下标和列下标
I =
1 2 2
J =
1 1 2
改变矩阵的形状
reshape 函数
reshape(A, m, n)
保持矩阵元素的顺序(序号不变),改变形状的大小,在创建矩阵时非常方便。
>> A = [1:15]
A =
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
>> reshape(A, 3, 5)
ans =
1 4 7 10 13
2 5 8 11 14
3 6 9 12 15
转换与转置
A(:)
将 A
转为一个列向量。
>> A = [1:3]
A =
1 2 3
>> A(:)
ans =
1
2
3
如果 A
已经是一个列向量,则不会发生任何变化。
在本例的情况下(矩阵为行向量)也可以使用 A'
(矩阵转置)实现同样的功能。