5

今天提出的一个问题在隐式数组创建方面给出了令人惊讶的结果:

array1 = 5*rand(496736,1);
array2 = 25*rand(9286,1);
output = zeros(numel(array1), numel(array2)); % Requires 34GB RAM
output = zeros(numel(array1), numel(array2),'logical'); % Requires 4.3GB RAM
output = abs(bsxfun(@minus, array1.', array2)) <= 2; % Requires 34GB RAM
output = pdist2(array1(:), array2(:)) <= 2; % Requires 34GB RAM

到目前为止,一切都很好。包含 496736*9286 双精度值的数组应该是 34GB,而包含相同数量元素的逻辑数组只需要 4.3GB(小 8 倍)。后两者会发生这种情况,因为它们使用包含所有双精度距离对的中间矩阵,需要完整的 34GB,而逻辑矩阵直接预分配为逻辑矩阵,需要 4.3GB。

令人惊讶的部分来了:

output = abs(array1.' - array2); % Requires 34GB RAM
output = abs(array1.' - array2) <= 2; % Requires 4.3GB RAM ?!?

什么?!?由于创建了中间双矩阵,为什么隐式扩展不需要相同的 34GB RAM output = abs(array1.' - array2)

这特别奇怪,因为据我了解,隐式扩展是编写旧bsxfun解决方案的一种简短方法。因此,为什么会bsxfun创建完整的 34GB 矩阵,而隐式扩展却没有呢?

MATLAB 是否以某种方式识别运算的输出应该是逻辑矩阵?


在 MATLAB R2018b、Ubuntu 18.04、16GB RAM 上执行的所有测试(即 34GB 阵列出错)

4

0 回答 0