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是元素个数

矩阵元素的引用

在matlab中,只要 matlab 能推断新矩阵的形状,就允许修改矩阵元素时自动扩大矩阵大小。具体来说,通过下标引用扩大矩阵大小总是允许的,通过序号引用扩大矩阵大小当且仅当矩阵为行向量或列向量时允许。

通过下标引用

A(i, j) 访问矩阵第i行第j列的元素,可以作为表达式的左值。

  1. 这是一个左值表达式,即允许修改这个表达式的值

    例如:A(1,1)=1表示将矩阵第1行第1列的元素修改为1

  2. 访问会执行下标检查

    • 若修改数组元素且访问位置超过矩阵大小,则会自动扩大矩阵。
    • 若读取数组元素且访问位置超过矩阵大小,则会提出得到一个错误。
  3. 根据matlab的语法,两个参数均可为矩阵,表示同时在这些行和列中的元素,例如:
A = reshape([1:25],5,5) % 创建 5x5 矩阵
A(2,:) % 访问第二行所有元素
A([2,3],[2,3]) = 233 % 将同时在第2,3行和第2,3列的元素修改为 233

输出:

创建 5x5 矩阵

$$ \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} $$

将同时在第2,3行和第2,3列的元素修改为 233

$$ \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 函数生成零矩阵,覆盖原来的元素
    • 配合使用 sizezeros 函数传递矩阵大小参数
  • 将元素删除,缩减矩阵大小

    • 引用相应元素后设置为 []
    • 若删除的元素不是一整行,则矩阵会变成一个行向量。

清空矩阵有两种方式,一种是将元素设为零,另一种是删除对应元素,缩减矩阵大小。


>> 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'(矩阵转置)实现同样的功能。

最后修改:2020 年 05 月 11 日
如果觉得我的文章对你有用,请随意赞赏