【问题标题】:MATLAB Memory Management of Matrix Column/Row-Deletion矩阵列/行删除的 MATLAB 内存管理
【发布时间】:2018-09-26 19:42:53
【问题描述】:

我在 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 仍将位于同一内存位置?

【问题讨论】:

    标签: arrays matlab memory


    【解决方案1】:

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

    我会说答案是:可能,当然也可能,但语言文档不一定指定它是否确实如此(至少我没有看到)。

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

    但是,如果您的 A 数组值仅限于单个引用,Matlab 理论上可以为数组的底层值保留相同的分配内存,并在同一块内存,最后留下一些未使用的内存。我怀疑它是否真的会这样做,因为这会浪费内存,并且没有明确的点在将来会被回收。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-05-26
      • 2011-05-09
      • 1970-01-01
      • 1970-01-01
      • 2013-03-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多