主要内容

空数组

MATLAB® 中的空数组是指没有元素的数组。空数组可用于以编程方式表示“无”的概念。空数组具有特定的维度,其中至少有一个维度为 0。最简单的空数组是 0×0,但空数组可以是具有一些非零维度的数组,例如 0×5 或 3×0×5。

创建空数组

要创建一个 0×0 数组,请使用方括号而不指定任何值。通过使用 size 函数验证数组维度。

A = []
A =

     []
size(A)
ans = 1×2

     0     0

在大多数需要创建空数组的情况下,0×0 数组就足够了。不过,您可以使用 zerosones 等函数创建不同大小的空数组。例如,创建一个 0×5 矩阵和一个 3×0×5 数组。

B = zeros(0,5)
B =

  0×5 empty double matrix
C = ones(3,0,5)
C =

  3×0×5 empty double array

方括号内包含 zerosones 会创建默认为 double 数据类型的空数值数组。要创建将文本作为数据进行处理的空数组,请使用 strings 函数。此函数会创建一个具有任何指定大小的不包含字符的字符串数组。例如,创建一个 0×5 空字符串数组。

S = strings(0,5)
S = 

  0×5 empty string array

要创建任何数据类型的空数组,您可以使用 createArray自 R2024a 开始提供)。例如,创建一个 8 位有符号整数类型 int8 的 5×0 矩阵。

D = createArray(5,0,"int8")
D =

  5×0 empty int8 matrix

运算结果为空

某些运算可以返回空数组。这些空数组很有用,因为它们可以在算法中流动而无需特殊处理。

例如,使用 find 函数查找行向量中所有小于 0 的元素。如果向量的所有元素都大于 0,则 find 返回一个空的索引行向量,因为没有元素满足指定条件。

A = [1 2 3 4];
ind = find(A < 0)
ind =

  1×0 empty double row vector

使用空行向量进行索引也会返回一个空行向量。

B = A(ind)
B =

  1×0 empty double row vector

空结果也可以是矩阵或多维数组。例如,以下代码从矩阵 A 中提取子矩阵 B,其中 B 包含 A 的所有非零行。

A = zeros(5,3);
dim = 2;
B = A(any(A,dim),:)
B =

  0×3 empty double matrix

对于任何矩阵 AB 的大小都为 p×q,其中 pA 中具有任何非零值的行数,qA 的列数。如果 A 中不存在具有非零值的行,则 B 是大小为 0×q 的空数组。由于 B 可以是空数组,因此您可以在 A 中找到非零行的数量,而无需对空值情况进行特殊处理。

n_nonzero_rows = size(B,1)
n_nonzero_rows = 
0

如果您要显式检查空结果,可以使用 isempty 函数。

if isempty(B)
   disp("All rows of A contain all zeros.")
else
   disp("There are " + size(B,1) + " rows in A with nonzero values.")
end
All rows of A contain all zeros.

对空数组的运算

任何为常规矩阵和数组定义的运算都适用于空数组。运算可以涉及 m×n 数组,即使 mn 为零时也是如此。此类运算的结果大小与使用非空数组生成的结果大小一致。

在执行按元素运算时,具有兼容大小的数组会自动扩展为相同大小。有关详细信息,请参阅基本运算的兼容数组大小

例如,加号运算符 (+) 是按元素运算符。如果 b 是标量,则 A + b 生成的输出与 A 的大小相同,即使 A 为空也是如此。

A = zeros(1,0,2)
A =

  1×0×2 empty double array
C = A + 5
C =

  1×0×2 empty double array

同样,如果一个输入是空矩阵 A,另一个是与 A 具有相同行数的列向量 B,则 A + B 生成的输出与 A 的大小相同。

A = zeros(4,0)
A =

  4×0 empty double matrix
B = ones(4,1)
B = 4×1

     1
     1
     1
     1

C = A + B
C =

  4×0 empty double matrix

不过,某些函数按向量执行运算,例如 prodsum 函数。这些函数对向量输入生成标量输出,或对矩阵输入生成向量输出。当输入涉及空数组时,这些函数遵循数学约定。

对于非空输入矩阵,prod 函数对输入矩阵的每个列向量执行按向量运算。对于空输入数组,prod 函数返回 1,因为不带因子的乘法结果的乘积为空。根据数学惯例,此乘积的结果等于乘法单位元。例如,求非空矩阵和空矩阵的每列中元素的乘积。

C = prod([1 2 3; 2 3 4; 3 4 5])
C = 1×3

     6    24    60

C = prod([])
C = 
1
C = prod(zeros(0,3))
C = 1×3

     1     1     1

串联空数组

如果数据没有特定的初始值,您可以在存储和组织数据时使用空数组。您可以通过将空数组与非空数组串联来动态增大空数组。

当您将空数组与非空数组串联时,MATLAB 会略去空数组并在输出中忽略其维度。例如,创建一个名为 data 的空数组,然后使用循环方式扩展它。

data = [];
for k = 1:3
    data = [data rand(1,2)]
end
data = 1×2

    0.8147    0.9058

data = 1×4

    0.8147    0.9058    0.1270    0.9134

data = 1×6

    0.8147    0.9058    0.1270    0.9134    0.6324    0.0975

在第一次循环迭代中,大小为 0×0 的空数组与大小为 1×2 的非空数组串联,生成大小为 1×2 的输出。每次迭代都会向数组添加新数据。

当您串联两个具有兼容大小的空数组时,结果是一个空数组,其大小等于输入为非空时的输出大小。例如,创建一个大小为 0×5 的空数组。水平或垂直串联两个这样的数组以创建其他数组。结果分别是大小为 0×10 和 0×5 的空数组。

A = zeros(0,5);
B_horizontal = [A A]
B_horizontal =

  0×10 empty double matrix
B_vertical = [A; A]
B_vertical =

  0×5 empty double matrix

空数组作为占位符输入参量

某些 MATLAB 函数接受空数组作为占位符输入参量。

例如,max 函数查找数组的最大元素。如果 A 是矩阵,您可以使用 max(A) 查找 A 的每列的最大值。

A = [1 7 3;
     6 2 9];
m = max(A)
m = 1×3

     6     7     9

如果您为 max 函数指定非空的第二个输入,它将返回来自两个输入的最大元素。

B = [5 5 5;
     8 8 8];
M = max(A,B)
M = 2×3

     5     7     5
     8     8     9

要查找 A 的所有元素的最大值,您可以将一个空数组作为 max 的第二个参量传递,然后指定 "all"

m = max(A,[],"all")
m = 
9

使用方括号删除行或列

从现有矩阵中删除行或列的语法也使用方括号。

例如,从矩阵中删除第三列。

A = magic(3)
A = 3×3

     8     1     6
     3     5     7
     4     9     2

A(:,3) = []
A = 3×2

     8     1
     3     5
     4     9

在这种情况下,[] 不是表示大小为 0×0 的空数组。如果您将空数组赋给 A(:,3),例如在 A(:,3) = zeros(0,0) 中,代码将返回错误,因为赋值表达式的左侧和右侧的大小不匹配。

另请参阅

主题