本页对应的英文页面已更新,但尚未翻译。 若要查看最新内容,请点击此处访问英文页面。

索引

下标

A 的行 i 和列 j 中的元素通过 A(i,j) 表示。例如,A(4,2) 表示第四行和第二列中的数字。在幻方矩阵中,A(4,2)15。因此,要计算 A 第四列中的元素的总和,请键入

A(1,4) + A(2,4) + A(3,4) + A(4,4)

此下标生成

ans =
     34

但这不是计算某列总和的最佳方法。

此外,还可以使用单一下标 A(k) 引用矩阵的元素。单一下标是引用行和列向量的常见方法。但是,也可以对满二维矩阵应用单一下标。在这种情况下,数组被视为一个由原始矩阵的列构成的长列向量。因此,在幻方矩阵中,A(8) 是另一种引用存储在 A(4,2) 中的值 15 的方法。

如果尝试使用矩阵外部元素的值,则会生成错误:

t = A(4,5)
索引超出矩阵维度。

相反,如果将值存储在矩阵外部元素中,则会增大大小以便容纳新元素:

X = A;
X(4,5) = 17

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

冒号运算符

冒号 : 是最重要的 MATLAB® 运算符之一。它以多种不同形式出现。表达式

1:10

是包含从 1 到 10 之间的整数的行向量:

1     2     3     4     5     6     7     8     9    10

要获取非单位间距,请指定增量。例如,

100:-7:50

100    93    86    79    72    65    58    51

0:pi/4:pi

0    0.7854    1.5708    2.3562    3.1416

包含冒号的下标表达式引用部分矩阵:

A(1:k,j)

表示 Aj 列中的前 k 个元素。因此,

sum(A(1:4,4))

计算第四列的总和。但是,执行此计算有一种更好的方法。冒号本身引用矩阵行或列中的所有元素,而关键字 end 引用最后一个行或列。因此,

sum(A(:,end))

计算 A 最后一列中的元素的总和:

ans =
     34

为什么 4×4 幻方矩阵的幻数和等于 34?如果将介于 1 到 16 之间的整数分为四个总和相等的组,该总和必须为

sum(1:16)/4

当然,也即

ans =
     34

串联

串联是连接小矩阵以便形成更大矩阵的过程。实际上,第一个矩阵是通过将其各个元素串联起来而构成的。成对的方括号 [] 即为串联运算符。例如,从 4×4 幻方矩阵 A 开始,组成

B = [A  A+32; A+48  A+16]

结果会生成一个 8×8 矩阵,这是通过连接四个子矩阵获得的:

B =

    16     3     2    13    48    35    34    45
     5    10    11     8    37    42    43    40
     9     6     7    12    41    38    39    44
     4    15    14     1    36    47    46    33
    64    51    50    61    32    19    18    29
    53    58    59    56    21    26    27    24
    57    54    55    60    25    22    23    28
    52    63    62    49    20    31    30    17

此矩阵是一个接近于幻方矩阵的矩阵。此矩阵的元素是经过重新排列的整数 1:64。此矩阵的列总和符合 8×8 幻方矩阵的要求:

sum(B)

ans =
   260   260   260   260   260   260   260   260

但是其行总和 sum(B')' 并不完全相同。要使其成为有效的 8×8 幻方矩阵,需要进行进一步操作。

删除行和列

只需使用一对方括号即可从矩阵中删除行和列。首先

X = A;

然后,要删除 X 的第二列,请使用

X(:,2) = []

这会将 X 更改为

X =
    16     2    13
     5    11     8 
     9     7    12
     4    14     1

如果您删除矩阵中的单个元素,结果将不再是矩阵。因此,以下类似表达式

X(1,2) = []

将会导致错误。但是,使用单一下标可以删除一个元素或元素序列,并将其余元素重构为一个行向量。因此

X(2:2:10) = []

生成

X =
    16     9     2     7    13    12     1

标量扩展

可以采用多种不同方法将矩阵和标量合并在一起。例如,通过从每个元素中减去标量而将其从矩阵中减去。幻方矩阵的元素平均值为 8.5,因此

B = A - 8.5

形成一个列总和为零的矩阵:

B =
      7.5     -5.5     -6.5      4.5
     -3.5      1.5      2.5     -0.5
      0.5     -2.5     -1.5      3.5
     -4.5      6.5      5.5     -7.5

sum(B)

ans =
     0     0     0     0

通过标量扩展,MATLAB 会为范围中的所有索引分配一个指定标量。例如,

B(1:2,2:3) = 0

B 的某个部分清零:

B =
      7.5        0        0      4.5
     -3.5        0        0     -0.5
      0.5     -2.5     -1.5      3.5
     -4.5      6.5      5.5     -7.5

逻辑下标

根据逻辑和关系运算创建的逻辑向量可用于引用子数组。假定 X 是一个普通矩阵,L 是一个由某个逻辑运算生成的同等大小的矩阵。那么,X(L) 指定 X 的元素,其中 L 的元素为非零。

通过将逻辑运算指定为下标表达式,可以在一个步骤中完成这种下标。假定您具有以下数据集:

x = [2.1 1.7 1.6 1.5 NaN 1.9 1.8 1.5 5.1 1.8 1.4 2.2 1.6 1.8];

NaN 是用于缺少的观测值的标记,例如,无法响应问卷中的某个项。要使用逻辑索引删除缺少的数据,请使用 isfinite(x),对于所有有限数值,该函数为 true;对于 NaNInf,该函数为 false:

x = x(isfinite(x))
x =
  2.1 1.7 1.6 1.5 1.9 1.8 1.5 5.1 1.8 1.4 2.2 1.6 1.8

现在,存在一个似乎与其他项很不一样的观测值,即 5.1。这是一个离群值。下面的语句可删除离群值,在本示例中,即比均值大三倍标准差的元素:

x = x(abs(x-mean(x)) <= 3*std(x))
x =
  2.1 1.7 1.6 1.5 1.9 1.8 1.5 1.8 1.4 2.2 1.6 1.8

标量扩展对于另一示例,请使用逻辑索引和标量扩展将非质数设置为 0,以便高亮显示丢勒幻方矩阵中的质数的位置。(请参阅 magic 函数。)

A(~isprime(A)) = 0

A =
     0     3     2    13
     5     0    11     0
     0     0     7     0
     0     0     0     0

find 函数

find 函数可用于确定与指定逻辑条件相符的数组元素的索引。find 以最简单的形式返回索引的列向量。转置该向量以便获取索引的行向量。例如,再次从丢勒的幻方矩阵开始。(请参阅 magic 函数。)

k = find(isprime(A))'

使用一维索引选取幻方矩阵中的质数的位置:

k =
     2     5     9    10    11    13

使用以下命令按 k 确定的顺序将这些质数显示为行向量

A(k)

ans =
     5     3     2    11     7    13

k 用作赋值语句的左侧索引时,会保留矩阵结构:

A(k) = NaN

A =
    16   NaN   NaN   NaN
   NaN    10   NaN     8
     9     6   NaN    12
     4    15    14     1