Matlab的数组索引

2022-07-27 09:21:32 浏览数 (1)

在 MATLAB中,根据元素在数组中的位置(索引)访问数组元素的方法主要有三种:按位置索引、线性索引和逻辑索引。

按元素位置进行索引

最常见的方法是显式指定元素的索引。例如,要访问矩阵中的某个元素,请依序指定该元素的行号和列号。

代码语言:javascript复制
A = [1 2 3 4; 5 6 7 8; 9 10 11 12; 13 14 15 16]
A = 4×4

     1     2     3     4
     5     6     7     8
     9    10    11    12
    13    14    15    16


e = A(3,2)
e = 10

e 是 A 中位于 3,2 位置(第三行第二列)的元素。

还可以在一个向量中指定多个元素的索引,从而一次引用多个元素。例如,访问 A 的第二行中的第一个和第三个元素。

代码语言:javascript复制
r = A(2,[1 3])
r = 1×2

     5     7

要访问某个行范围或列范围内的元素,请使用 colon。例如,访问 A 中第一到三行、第二到四列中的元素。

代码语言:javascript复制
r = A(1:3,2:4)
r = 3×3

     2     3     4
     6     7     8
    10    11    12

计算 r 的另一种方法是使用关键字 end 指定第二直至最后一列。通过此方法,可以直接指定最后一列,而不必知道 A 中到底有多少列。

代码语言:javascript复制
r = A(1:3,2:end)
r = 3×3

     2     3     4
     6     7     8
    10    11    12

如果要访问所有行或所有列,只使用冒号运算符即可。例如,返回 A 的整个第三列。

代码语言:javascript复制
r = A(:,3)
r = 4×1

     3
     7
    11
    15

通常,可以使用索引来访问 MATLAB 中任何数组的元素,而不管其数据类型或维度如何。例如,直接访问 datetime 数组的列。

代码语言:javascript复制
t = [datetime(2018,1:5,1); datetime(2019,1:5,1)]
t = 2x5 datetime
   01-Jan-2018   01-Feb-2018   01-Mar-2018   01-Apr-2018   01-May-2018
   01-Jan-2019   01-Feb-2019   01-Mar-2019   01-Apr-2019   01-May-2019


march1 = t(:,3)
march1 = 2x1 datetime
   01-Mar-2018
   01-Mar-2019

对于更高维度的数组,可以扩展语法以匹配数组维度。假设有一个随机的 3×3×3 数值数组。访问位于该数组第一页中第二行第三列的元素。

代码语言:javascript复制
A = rand(3,3,3);
e = A(2,3,1)
e = 0.5469

使用单个索引进行索引

访问数组元素的另一种方法是只使用单个索引,而不管数组的大小或维度如何。此方法称为线性索引。虽然 MATLAB 根据定义的大小和形状显示数组,但实际上数组在内存中都存储为单列元素。我们可以使用矩阵来直观地理解这一概念。下面的数组虽然显示为 3×3 矩阵,但 MATLAB 将它存储为单列,由 A 的各列顺次连接而成。存储的向量包含由元素 12、45、33、36、29、25、91、48、11 组成的序列,可以用单个冒号全部显示。

代码语言:javascript复制
A = [12 36 91; 45 29 48; 33 25 11]
A = 3×3

    12    36    91
    45    29    48
    33    25    11


Alinear = A(:)
Alinear = 9×1

    12
    45
    33
    36
    29
    25
    91
    48
    11

例如,A 的第 3,2 个元素是 25,您可以使用语法 A(3,2) 访问它。您也可以使用语法 A(6) 访问此元素,因为 25 是存储的向量序列中的第六个元素。

代码语言:javascript复制
e = A(3,2)
e = 25

elinear = A(6)
elinear = 25

线性索引在视觉上可能不太直观,但在执行某些不依赖于数组大小或形状的计算时很有用。例如,可以轻松地对 A 的所有元素求和,而无需指定 sum 函数的第二个参数。

代码语言:javascript复制
s = sum(A(:))
s = 330

sub2ind 和 ind2sub 函数可用于在数组的原始索引和线性索引之间进行转换。例如,计算 A 的第 3,2 个元素的线性索引。

代码语言:javascript复制
linearidx = sub2ind(size(A),3,2)
linearidx = 6

从线性索引转换回行和列形式。

代码语言:javascript复制
[row,col] = ind2sub(size(A),6)
row = 3

col = 2

使用逻辑值进行索引

使用 true 和 false 逻辑指示符也可以对数组进行索引,在处理条件语句时尤其便利。例如,假设想知道矩阵 A 中的元素是否小于另一个矩阵 B 中的对应元素。当 A 中的元素小于 B 中的对应元素时,小于号运算符返回元素为 1 的逻辑数组。

代码语言:javascript复制
A = [1 2 6; 4 3 6]
A = 2×3

     1     2     6
     4     3     6


B = [0 3 7; 3 7 5]
B = 2×3

     0     3     7
     3     7     5


ind = A<B
ind = 2x3 logical array

   0   1   1
   0   1   0

现在已经知道满足条件的元素的位置,可以使用 ind 作为索引数组来检查各个值。MATLAB 将 ind 中值 1 的位置与 A 和 B 中的对应元素进行匹配,并在列向量中列出它们的值。

代码语言:javascript复制
Avals = A(ind)
Avals = 3×1

     2
     3
     6


Bvals = B(ind)
Bvals = 3×1

     3
     7
     7

MATLAB 中的 is 函数还返回逻辑数组,指示输入中的哪些元素满足特定条件。例如,使用 ismissing 函数检查 string 向量中的哪些元素是缺失值。

代码语言:javascript复制
str = ["A" "B" missing "D" "E" missing];
ind = ismissing(str)
ind = 1x6 logical array

   0   0   1   0   0   1

假设要查找非缺失值元素的值。将 ~ 运算符和索引向量 ind 结合使用即可实现此目的。

代码语言:javascript复制
strvals = str(~ind)
strvals = 1x4 string
    "A"    "B"    "D"    "E"

0 人点赞