一索引表达式允许您引用或提取向量、矩阵(2-D)或高维数组的选定元素。数组可以通过以下三种方式之一进行索引:Component Indexing, Linear Indexing和Logical Indexing.
分量索引可以是标量、向量、范围或特殊运算符:,它选择整行、整列或更高维度的切片。
组件索引表达式从一组括号组成M用逗号分隔的表达式。每个单独的索引值或组件用于应用到的对象的相应维度。换句话说,第一个索引组件用于对象的第一个维度(行),第二个索引组件用作对象的第二个维度(列),依此类推。索引组件的数量M定义索引表达式的维度。具有两个分量的索引将被称为2-D索引,因为它具有两个维度。
在最简单的情况下,1)所有分量都是标量,2)索引表达式的维数M等于对象应用于的维度。例如:
A = reshape (1:8, 2, 2, 2) # Create 3-D array A = ans(:,:,1) = 1 3 2 4 ans(:,:,2) = 5 7 6 8 A(2, 1, 2) # second row, first column of second slice # in third dimension: ans = 6
返回的对象在特定维度中的大小等于索引表达式的相应组件中的元素数。当所有组件都是标量时,结果是单个输出值。然而,如果任何分量是向量或范围,则返回的值是各个维度中的索引的笛卡尔积。例如
A([1, 2], 1, 2) ≡ [A(1,1,2); A(2,1,2)] ⇒ ans = 5 6
返回值的总数是每个索引组件返回的元素数的乘积。在上面的例子中,总数是2*1*1=2个元素。
请注意,给定维度中返回对象的大小等于该维度的索引表达式中的元素数。在上面的代码中,第一个索引组件([1, 2]
)被指定为行向量,但其形状并不重要。重要的事实是,组件指定了两个值,因此结果在第一维度中的大小必须为2;因为第一个维度对应于行,所以总体结果是列向量。
A(1, [2, 1, 1], 1) # result is a row vector: ans = [3, 1, 1] A(ones (2, 2), 1, 1) # result is a column vector: ans = [1; 1; 1; 1]
第一行再次证明了给定维度中输出的大小等于相应索引组件中的元素数量。在这种情况下,输出在第二维度中有三个元素(对应于列),因此结果是行向量。示例还显示了如何使用索引表达式中的重复条目来复制输出中的元素。最后一个例子进一步证明了索引组件的形状是无关的,重要的只是元素的数量(2x2=4)。
只要索引表达式的维度大于1,则适用上述规则(M>1). 但是,对于一维索引表达式,应用特殊规则和输出的形状是从分度部件的形状确定。例如
A([1, 2]) # result is a row vector: ans = [1, 2] A([1; 2]) # result is a column vector: ans = [1; 2]
的形状规则A(P是
冒号(:)可以用作索引组件来选择指定维度中的所有元素。给定矩阵,
A = [1, 2; 3, 4]
以下所有表达式都是等价的,并选择矩阵的第一行。
A(1, [1, 2]) # row 1, columns 1 and 2 A(1, 1:2) # row 1, columns in range 1-2 A(1, :) # row 1, all columns
当在1-D索引的特殊情况下使用冒号时,结果总是列向量。创建带有冒号索引的列向量是一种经常使用的代码习惯用法,它比调用reshape
对于这种情况。
A(:) # result is column vector: ans = [1; 2; 3; 4] A(:)' # result is row vector: ans = [1, 2, 3, 4]
在索引表达式中,关键字end
自动引用特定维度的最后一个条目。这个神奇的索引也可以用于范围,通常不需要调用size
或length
在索引之前切换数组边界。例如
A(1:end/2) # first half of A => [1, 2] A(end + 1) = 5; # append element A(end) = []; # delete element A(1:2:end) # odd elements of A => [1, 3] A(2:2:end) # even elements of A => [2, 4] A(end:-1:1) # reversal of A => [4, 3, 2, 1]
有关更多信息,详见"end" keyword
.
允许对多维对象使用一维索引。这也叫线性索引在这种情况下,像在Fortran中一样,多维数组的元素是按列第一的顺序获取的。也就是说,数组的列被想象成堆叠在彼此之上以形成列向量,然后将单个线性索引应用于该向量。
A = [1, 2, 3; 4, 5, 6; 7, 8, 9]; A(4) # linear index of 4th element in 2-D array: ans = 2 A(3:5) # result has shape of index component: ans = [7, 2, 5] A([1, 2, 2, 1]) # result includes repeated elements: ans = [1, 4, 4, 1]
逻辑值也可以用于索引矩阵和元胞数组。当使用逻辑数组进行索引时,结果将是一个向量,其中包含与true
逻辑数组的部分。以下示例说明了这一点。
data = [ 1, 2; 3, 4 ]; idx = [true, false; false true]; data(idx) ⇒ ans = [ 1; 4 ] idx = (data <= 2); data(idx) ⇒ ans = [ 1; 2 ]
而不是创建idx
可以替换的数组data(idx)
具有data( data <= 2 )
在上面的代码中。
虽然逻辑索引表达式的大小通常与被索引的数组的大小相同,但这不是必要条件。如果逻辑索引的大小与数组不同,那么数组中的元素将根据其线性顺序与逻辑索引中的元素进行匹配,就像线性索引一样。
data = [ 1, 2, 3; 4, 5, 6 ]; idx = [ true, false, false, true ]; data(idx) ⇒ ans = [ 1 5 ] # idx selected the 1st and 4th position elements
如果逻辑索引大于该数组,则如果任何真值试图选择大于数组中元素数量的线性位置,则会发生越界错误。
idx = [ true, true, false; false, true, false; true; false; false ]; data(idx) ⇒ ans = [ 1; 2; 5; 3 ] # returns positions 1, 3, 4, 5 in a column idx = [ true, true, false; false, true, false; true; false; true ]; data(idx) ⇒ error: a(9): out of bound 6 (dimensions are 2x3)
逻辑索引中超出数组大小的假元素会被忽略,但当逻辑索引的第九个元素为真时,它会在尝试选择数组中不存在的第九元素时触发错误。
版权所有 © 2024-2025 Octave中文网
ICP备案/许可证号:黑ICP备2024030411号-2