热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

MATLAB的隐式广播是否会根据周围的代码进行优化?

如何解决《MATLAB的隐式广播是否会根据周围的代码进行优化?》经验,如何解决这个问题?

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

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阵列错误输出)上执行的所有测试


推荐阅读
author-avatar
莣Q楽
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有