Matlab的数组索引

Posted studyer_domi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Matlab的数组索引相关的知识,希望对你有一定的参考价值。

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

按元素位置进行索引

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

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 的第二行中的第一个和第三个元素。

r = A(2,[1 3])r = 1×2
     5     7

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

r = A(1:3,2:4)r = 3×3
     2     3     4     6     7     8    10    11    12

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

r = A(1:3,2:end)r = 3×3
     2     3     4     6     7     8    10    11    12

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

r = A(:,3)r = 4×1
     3     7    11    15

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

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 数值数组。访问位于该数组第一页中第二行第三列的元素。

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 组成的序列,可以用单个冒号全部显示。

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 是存储的向量序列中的第六个元素。

e = A(3,2)e = 25
elinear = A(6)elinear = 25

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

s = sum(A(:))s = 330

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

linearidx = sub2ind(size(A),3,2)linearidx = 6

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

[row,col] = ind2sub(size(A),6)row = 3
col = 2

使用逻辑值进行索引

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

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<Bind = 2x3 logical array
   0   1   1   0   1   0

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

Avals = A(ind)Avals = 3×1
     2     3     6

Bvals = B(ind)Bvals = 3×1
     3     7     7

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

str = ["A" "B" missing "D" "E" missing];ind = ismissing(str)ind = 1x6 logical array
   0   0   1   0   0   1

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

strvals = str(~ind)strvals = 1x4 string    "A"    "B"    "D"    "E"

 

以上是关于Matlab的数组索引的主要内容,如果未能解决你的问题,请参考以下文章

Matlab的数组索引

MATLAB:在数组旁边打印索引

MATLAB:无法调用或索引到临时数组[重复]

在片段着色器中,为啥我不能使用平面输入整数来索引 sampler2D 的统一数组?

Matlab - 使用矩阵作为数组向量的索引

在 Julia 中返回数组中的最小索引