置换操作需要将不同的矩阵输出到输出,它是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数据。
答案 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
下重复了测试,显示了相同的模式:
你可以看到这个函数在峰值时的内存使用量是返回时的两倍。
虽然这不是描述内存使用情况的最佳方式(更好地使用适当的内存分析器,例如Intel Inspector XE),但它确实在某种程度上显示permute
确实无效-place 强>
答案 1 :(得分:3)
这只是一个猜测,因为我真的不知道permute
在幕后做了什么。
维度的置换总是可以作为一系列基本置换操作来完成,其中"初级"意味着只交换两个维度。例如,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]
这些基本操作中的每一个(交换两个维度)本质上是沿着多维数组的给定平面的转置,沿着所有其他维度重复执行。
转置can be done inline,只需要固定数量的额外内存,与数组大小无关,或者数组大小增长非常慢。
将这三个事实放在一起表明,可能可以在没有大量额外内存的情况下执行此操作。但这可能不是Matlab实际使用的方法。