3

如果我们写,例如:

x = int8.empty(0,5)

whos x输出:

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

因此,我们获得了一个0x5空数组 class int8

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

在这种情况下

x = int8.empty(0,5)

比有用

x = int8.empty(0,0)

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

4

2 回答 2

4

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

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 中有更简单的实现方法。但关键是我想根据输入中的预分配结果。此代码具有明确定义的后置条件:

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

并且它不必特殊情况下没有符合我的条件的情况。如果 MATLAB 允许对空数组的形状进行限制,那么这些都不成立。

于 2020-10-14T14:26:35.837 回答
4

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

这样做也有正式的原因:一个函数或操作可以根据其输入的维度来定义,例如“接受一个 m×n 数组并返回一个 k×n 数组,其中 k = somefunction( m 或其值)”,并且在 k 结果为零的退化情况下,具有一些非零维度的空数组允许这样的操作仍然严格遵守其合同。

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

于 2020-10-16T02:47:43.967 回答