Loading... # Matlab 矩阵类型 ## 创建普通矩阵 <div class="tip inlineBlock info"> 相关视频 https://www.bilibili.com/video/BV19J411W7Ta?p=5 </div> 在 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} $$ ### 由已有矩阵建立 ```matlib 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} $$ ### 通过矩阵运算 ```matlab 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} $$ ## 创建向量 <div class="tip inlineBlock info"> 相关视频 https://www.bilibili.com/video/BV19J411W7Ta?p=5 </div> 向量是一种特殊的矩阵,行向量只有一行,列向量只有一列。下面的命令创建的是行向量。 ### 冒号表达式 格式:`初始值:步长:终止值`,双闭区间,即包含两个区间端点, 若步长省略,则默认步长为1 ```matlab 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`是元素个数 ## 矩阵元素的引用 <div class="tip inlineBlock info"> 相关内容 https://www.bilibili.com/video/BV19J411W7Ta?p=6 </div> <div class="tip inlineBlock info"> 在matlab中,只要 matlab 能推断新矩阵的形状,就允许修改矩阵元素时自动扩大矩阵大小。具体来说,通过下标引用扩大矩阵大小总是允许的,通过序号引用扩大矩阵大小当且仅当矩阵为行向量或列向量时允许。 </div> ### 通过下标引用 `A(i, j)` 访问矩阵第`i`行第`j`列的元素,可以作为表达式的左值。 1. 这是一个左值表达式,即允许修改这个表达式的值 例如:`A(1,1)=1`表示将矩阵第`1`行第`1`列的元素修改为`1` 2. 访问会执行下标检查 - 若修改数组元素且访问位置超过矩阵大小,则会自动扩大矩阵。 - 若读取数组元素且访问位置超过矩阵大小,则会提出得到一个错误。 3. 根据matlab的语法,两个参数均可为矩阵,表示同时在这些行和列中的元素,例如: ```matlab A = reshape([1:25],5,5) % 创建 5x5 矩阵 A(2,:) % 访问第二行所有元素 A([2,3],[2,3]) = 233 % 将同时在第2,3行和第2,3列的元素修改为 233 ``` **输出:** <div class="panel panel-default collapse-panel box-shadow-wrap-lg"><div class="panel-heading panel-collapse" data-toggle="collapse" data-target="#collapse-b569dffe121e63c6e36fffe69fde6e5e5" aria-expanded="true"><div class="accordion-toggle"><span style="">创建 5x5 矩阵</span> <i class="pull-right fontello icon-fw fontello-angle-right"></i> </div> </div> <div class="panel-body collapse-panel-body"> <div id="collapse-b569dffe121e63c6e36fffe69fde6e5e5" class="collapse collapse-content"><p></p> $$ \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} $$ <p></p></div></div></div> <div class="panel panel-default collapse-panel box-shadow-wrap-lg"><div class="panel-heading panel-collapse" data-toggle="collapse" data-target="#collapse-1fc5b4b6291a683ec567a4f307a5013978" aria-expanded="true"><div class="accordion-toggle"><span style="">访问第二行所有元素</span> <i class="pull-right fontello icon-fw fontello-angle-right"></i> </div> </div> <div class="panel-body collapse-panel-body"> <div id="collapse-1fc5b4b6291a683ec567a4f307a5013978" class="collapse collapse-content"><p></p> $$ \begin{aligned} ans =& \\ &\begin{matrix} 2 & 7 & 12 & 17 & 22 \end{matrix} \end{aligned} $$ <p></p></div></div></div> <div class="panel panel-default collapse-panel box-shadow-wrap-lg"><div class="panel-heading panel-collapse" data-toggle="collapse" data-target="#collapse-ce1cb8155258742b807e330b04837b6857" aria-expanded="true"><div class="accordion-toggle"><span style="">将同时在第2,3行和第2,3列的元素修改为 233</span> <i class="pull-right fontello icon-fw fontello-angle-right"></i> </div> </div> <div class="panel-body collapse-panel-body"> <div id="collapse-ce1cb8155258742b807e330b04837b6857" class="collapse collapse-content"><p></p> $$ \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} $$ <p></p></div></div></div> ### 通过序号引用 `A(i)` 访问矩阵的第 `i` 个元素,也可以作为表达式的左值。序号和下标是一一对应的,对于一个mxn的矩阵,元素 `(i, j)` 的序号为 `(j - 1) * m + 1` 。 ```matlab >> 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` 函数传递矩阵大小参数 - 将元素删除,缩减矩阵大小 - 引用相应元素后设置为 `[]` - 若删除的元素不是一整行,则矩阵会变成一个行向量。 清空矩阵有两种方式,一种是将元素设为零,另一种是删除对应元素,缩减矩阵大小。 ```matlab >> 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` 将矩阵中指定元素的行、列下标转换为矩阵的序号。 ```matlab >> 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` 将矩阵元素的序号转换为下标 ```matlab >> 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)` 保持矩阵元素的顺序(序号不变),改变形状的大小,在创建矩阵时非常方便。 ```matlab >> 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` 转为一个列向量。 ```matlab >> A = [1:3] A = 1 2 3 >> A(:) ans = 1 2 3 ``` 如果 `A` 已经是一个列向量,则不会发生任何变化。 在本例的情况下(矩阵为行向量)也可以使用 `A'`(矩阵转置)实现同样的功能。 最后修改:2020 年 05 月 11 日 © 允许规范转载 赞 0 如果觉得我的文章对你有用,请随意赞赏