为什么空数组可以有非空维度?

Why can an empty array have a non-null dimension?

如果我们这样写,例如:

x = int8.empty(0,5)

whos x 输出:

% Name    Size    Bytes    Class    Attributes
% x       0x5     0        int8     

因此,我们得到一个0x5空数组classint8

如果内存大小为 0 字节,预分配包含非空维度的空数组的目的是什么?

在这种情况下

x = int8.empty(0,5)

更有用
x = int8.empty(0,0)

int8.empty(0,5) 是否仍预分配 5 个内存“插槽”?

我能想到的最简单的答案是连续性——这样我的代码就不必在某些东西需要零行或零列时编写特殊情况。考虑这个有点傻的功能:

function out = getAllRowsGt5(someMatrix)
rowIdxs = find(sum(someMatrix, 2) > 5);
out = zeros(numel(rowIdxs), size(someMatrix, 2));
for idx = 1:numel(rowIdxs)
    out(idx,:) = someMatrix(rowIdxs(idx), :);
end
end

当然,在 MATLAB 中有更简单的实现方法。但关键是我想根据输入中的 values 预分配结果。此代码有 well-defined post-conditions:

size(out, 2) == size(someMatrix, 2)

而且它不必 special-case 没有任何东西符合我的条件的情况。如果 MATLAB 允许的空数组的形状存在限制,那么这些都不是真的。

我已经 运行 了解 0-by-n 向量的实际用例:使用 Matlab 的新声明式 属性 和参数约束,您可以说“x 必须通过将其声明为 (:,1) 或 (:,3) 来成为 N-by-1" 或 "z must b n-by-3"。这允许您以一致的方式表示空集。

这样做也有正式的原因:函数或操作可以根据其输入的维度来定义,例如“采用 m-by-n 数组和 returns a k-by-n array where k = somefunction(m or its values)", 并且在 k 结果为零的退化情况下,具有一些非零维度的空数组允许像这样的操作仍然严格遵守他们的合同.

实际上,对于连接等基本操作,所有空数组通常都是可以互换的,通常只是工作或最多产生一个警告。