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

时间:2016-03-17 15:36:59

标签: matlab

置换操作需要将不同的矩阵输出到输出,它是not like reshape,其中数据未被修改,permute会修改数据。

但是,如果测试多维排列的内存使用情况,则它与使用的变量相同。所以,我的问题是,如何 MATLAB执行这种排列以避免使用任何额外的内存?

额外的问题:MATLAB是否有实际使用额外内存的情况?

测试代码:

function out=mtest() 
   out = ones(1e3,1e3,1e3); % Caution, 8Gb
   out=permute(out,[3 1 2]);
end 

请使用以下方式调用:

profile -memory on
a=mtest;
profreport

注意,其8Gb数据。

2 个答案:

答案 0 :(得分:10)

你的论点存在缺陷,因为MATLAB内存分析器并没有说实话!

permute方法实际上会创建矩阵的第二个副本,并且数据置换并返回...

我自己试过这个:

  • 在Windows 10中,我打开了"任务管理器"关于"表现"带有"记忆的标签"视图中的图形。我还设置了#34;更新速度"到"高"获得更好的时间分辨率。

  • 我的笔记本电脑上只有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
    
  • 然后我按照以下方式运行该功能:

    %clear a
    a = mtest();
    

    并观察内存使用情况;它从使用中的1.8演出开始,升至5.2然后迅速降至3.6演出。这确认创建了副本。

我还在perfmon.exe下重复了测试,显示了相同的模式:

perfmon

你可以看到这个函数在峰值时的内存使用量是返回时的两倍。

虽然这不是描述内存使用情况的最佳方式(更好地使用适当的内存分析器,例如Intel Inspector XE),但它确实在某种程度上显示permute确实无效-place

答案 1 :(得分:3)

这只是一个猜测,因为我真的不知道permute在幕后做了什么。

  1. 维度的置换总是可以作为一系列基本置换操作来完成,其中"初级"意味着只交换两个维度。例如,permute(x, [4 1 2 3])等同于这个基本置换操作序列(序列不是唯一的):

    permute(..., [4 2 3 1]) %// interchange dims 1 and 4: we have dims [4 2 3 1]
    permute(..., [1 4 3 2]) %// interchange dims 2 and 4: we have dims [4 1 3 2]
    permute(..., [1 2 4 3]) %// interchange dims 3 and 4: we have dims [4 1 2 3]
    
  2. 这些基本操作中的每一个(交换两个维度)本质上是沿着多维数组的给定平面的转置,沿着所有其他维度重复执行。

  3. 转置can be done inline,只需要固定数量的额外内存,与数组大小无关,或者数组大小增长非常慢。

  4. 将这三个事实放在一起表明,可能可以在没有大量额外内存的情况下执行此操作。但这可能不是Matlab实际使用的方法。