置换操作需要向输出输出不同的矩阵,而不是reshape在未修改permute数据的情况下修改数据.
但是,如果测试多维排列的内存使用情况,则它与使用的变量相同.所以,我的问题是,MATLAB 如何执行此排列以避免使用任何额外的内存?
额外的问题:有没有MATLAB实际使用额外内存的场景?
测试代码:
function out=mtest()
out = ones(1e3,1e3,1e3); % Caution, 8Gb
out=permute(out,[3 1 2]);
end
Run Code Online (Sandbox Code Playgroud)
称之为:
profile -memory on
a=mtest;
profreport
Run Code Online (Sandbox Code Playgroud)
小心,它的8Gb数据.
Amr*_*mro 10
你的论点是有缺陷的,因为MATLAB内存分析器并没有告诉你真相!
permute事实上,该方法确实创建了矩阵的第二个副本,其中数据被置换并返回...
我自己试过这个:
在Windows 10中,我打开了"性能"选项卡上的"任务管理器",其中包含"内存"图.我还将"更新速度"设置为"高"以获得更精细的时间分辨率.
我的笔记本电脑上只有8个内存,所以为了避免颠簸,我修改了你的功能:
function out = mtest()
out = rand([1e3,5e2,5e2]); % about 1.8 GB = 1e3*5e2*5e2*8/2^30
out = permute(out, [3 2 1]);
end
Run Code Online (Sandbox Code Playgroud)然后,我将该函数简单地运行为:
%clear a
a = mtest();
Run Code Online (Sandbox Code Playgroud)
并观看了内存使用情况; 它从使用中的1.8演出开始,升至5.2然后迅速降至3.6演出.这确认创建了副本.
我也重复了下面perfmon.exe显示相同模式的测试:
你可以看到它在峰值时的内存使用量是返回时的两倍.
虽然这不是分析内存使用情况的最佳方式(更好地使用适当的内存分析器,例如Intel Inspector XE),但它确实在某种程度上表明permute它确实无法就地工作.