为什么MATLAB的置换不需要额外的内存?

And*_*uri 14 matlab

置换操作需要向输出输出不同的矩阵,而不是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它确实无法就地工作.

  • 很好的答案!我猜`permute`的程序员更喜欢速度而不是内存效率 (2认同)