空数组
MATLAB® 中的空数组是指没有元素的数组。空数组可用于以编程方式表示“无”的概念。空数组具有特定的维度,其中至少有一个维度为 0。最简单的空数组是 0×0,但空数组可以是具有一些非零维度的数组,例如 0×5 或 3×0×5。
创建空数组
要创建一个 0×0 数组,请使用方括号而不指定任何值。通过使用 size 函数验证数组维度。
A = []
A =
[]
size(A)
ans = 1×2
0 0
在大多数需要创建空数组的情况下,0×0 数组就足够了。不过,您可以使用 zeros 或 ones 等函数创建不同大小的空数组。例如,创建一个 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
方括号内包含 zeros 和 ones 会创建默认为 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
对于任何矩阵 A,B 的大小都为 ×,其中 是 A 中具有任何非零值的行数, 是 A 的列数。如果 A 中不存在具有非零值的行,则 B 是大小为 0× 的空数组。由于 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.
对空数组的运算
任何为常规矩阵和数组定义的运算都适用于空数组。运算可以涉及 × 数组,即使 或 为零时也是如此。此类运算的结果大小与使用非空数组生成的结果大小一致。
在执行按元素运算时,具有兼容大小的数组会自动扩展为相同大小。有关详细信息,请参阅基本运算的兼容数组大小。
例如,加号运算符 (+) 是按元素运算符。如果 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
不过,某些函数按向量执行运算,例如 prod 和 sum 函数。这些函数对向量输入生成标量输出,或对矩阵输入生成向量输出。当输入涉及空数组时,这些函数遵循数学约定。
对于非空输入矩阵,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) 中,代码将返回错误,因为赋值表达式的左侧和右侧的大小不匹配。