今天提出的一个问题在隐式数组创建方面给出了令人惊讶的结果:
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个double值的数组应为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阵列错误输出)上执行的所有测试