矩阵列/行删除的MATLAB内存管理

时间:2018-09-26 19:42:54

标签: arrays matlab memory

我在MATLAB中有一个大小为5x4的数组。

A = [ 1  2  3  4
      5  6  7  8
      9 10 11 12
     13 14 15 16
     17 18 19 20];

由于MATLAB以列方式存储数组,因此A将按照以下顺序在内存中

A = 1, 5, 9, 13, 17, 2, 6, 10, 14, 18, 3, 7, 11, 15, 19, 4, 8, 12, 16, 20

我的问题是,当我删除A的最后两列/行时会发生什么:

A(:,3:4) = [];

A(4:5,:) = [];

MATLAB将在内存的不同部分中创建(复制)一个新数组,然后再次将新地址分配给A还是A仍位于相同的内存位置吗?

1 个答案:

答案 0 :(得分:2)

  

MATLAB会在内存的不同部分中创建(复制)新数组并将新地址再次分配给A吗?

我要说的答案是:可能,而且肯定可以,但是语言文档是否必须指定它是否确实是真的(至少不是我所见)。

通常,由于Matlab是一种按值传递,写时复制的语言,因此对数组内部数据的任何修改都会导致其重新分配和复制,因为任何其他现有的对该数组的引用需要保留旧值。 “就地”修改只是在Matlab可以确定数组值包含在本地范围/工作空间中的某些情况下使用的优化。因此,如果在A中保留了对该数组的任何其他引用,则肯定会重新分配并复制内存。

但是,如果您的A数组值仅限于该单个引用,则Matlab 可以理论上为数组的基础值保留相同的分配内存,并在同一数组中对其进行随机排序内存块,最后保留一些未使用的空间。我怀疑它是否真的会这样做,因为这会浪费内存,没有明确的位置将来会被回收。

实际上,我认为它总是会被复制到新分配的内存块中。

您可以通过在修改前后检查MEX API中mxGetData返回的指针地址来测试特定版本的Matlab,以查看是否符合您的情况,或者查看探查器中的内存分配