讲解视频:可以在bilibili搜索《MATLAB教程新手入门篇——数学建模清风主讲》。
MATLAB教程新手入门篇(数学建模清风主讲,适合零基础同学观看)_哔哩哔哩_bilibili
节选自第3章 3.3.2 矩阵元素的引用
在讲解矩阵元素的引用之前,我们先来回顾一下矩阵的表示方式:
上方给出了一个m行n列的矩阵,对于第i行第j列的元素,我们用表示。
因此,我们可以使用矩阵元素所处的行(row)和列(column)来进行引用矩阵的某一个元素,方式为:a(row_ind, column_ind).
这里的row_ind表示要引用的元素的行索引,column_ind表示列索引。如果row_ind和column_ind都是一个常数,则表示提取矩阵中的单个元素;如果row_ind或column_ind是包含有多个元素的向量,则表示同时提取多个位置的元素。与向量类似,end也可以用来替代最后一个索引,通常和冒号法一起使用。
下面我们来举两个例子,大家也可以打开本节的配套代码学习:“code_3_3_2”。
前面我们学过,可以使用length函数和numel函数来计算向量中包含的元素个数。那么,怎样计算一个矩阵的大小呢?我们可以使用size函数,它有两种常见的用法:
(1)size(A)返回一个行向量,其元素是A的各维度的长度。若A是一个3×4的矩阵,则size(A)返回向量[3 4];如果让[r,c] = size(A),那么r = 3,c = 4。
(2)size(A,dim)返回在维度dim上的长度。dim = 1时表示行;dim = 2时表示列。若A是一个3×4的矩阵,则size(A,1)返回3,size(A,2)返回4。
(length函数和numel函数也可以用在矩阵上。length函数会返回行和列的较大值:对上面的A矩阵,length(A)返回4;numel函数会返回矩阵中元素的总数,numel(A) 返回12)
有时候我们需要取出矩阵的某一行或者某一列。以取出矩阵A的第一行为例,我们可以使用代码A(1, 1:end),即row_ind取1表示第一行,column_ind取1:end表示从1到最后一列的索引。这时候我们可以直接将其简写为:A(1, :),逗号后面是列索引的位置,加一个冒号就表示取出每一列的元素。同理,要取第一列的所有元素,我们可以使用代码:A(:, 1).
总结:
-
A(:, n) 表示矩阵A的第n列的所有元素。
-
A(m, :) 表示矩阵A的第m行的所有元素。
练习:
前面我们介绍的是对矩阵的双下标进行索引,即同时指定行索引和列索引,中间用逗号隔开。有同学会问,我们能不能使用单个下标对矩阵进行索引呢?在MATLAB中是可以的,这种单下标的索引方法称为线性索引。
事实上,在MATLAB中,矩阵的数据在计算机的内存中被存储为单列。以下图为例,下面的矩阵虽然显示为 3×3 矩阵,但MATLAB在内存中将它存储为单列,由它的各列顺次连接而成。例如,第2行第2列的元素的线性索引为5,第2行第3列的元素的线性索引为8。
我们可以利用线性索引来取出矩阵中的元素,尽管这种方式并不那么直观。
另外,A(:)命令可以将A中的所有元素按照线性索引的顺序重构成一个列向量。
最后,sub2ind和ind2sub函数可用于在矩阵的原始索引(双下标)和线性索引之间进行转换。他们的功能刚好相反,sub2ind将矩阵的下标转换为线性索引;ind2sub将线性索引转换为下标。
(1) ind = sub2ind(sz,row,col) 针对大小为 sz 的矩阵返回由 row 和 col 指定的行列下标的对应线性索引 ind。此处,sz 是包含两个元素的向量,其中 sz(1) 指定行数,sz(2) 指定列数。
(2) [row,col] = ind2sub(sz,ind) 返回数组 row 和 col,其中包含与大小为 sz 的矩阵的线性索引 ind 对应的等效行和列下标。此处,sz 是包含两个元素的向量,其中 sz(1) 指定行数,sz(2) 指定列数。
我们举两个例子: