MATLAB Управление памятью матрицы-столбца / удаление строк - PullRequest
0 голосов
/ 26 сентября 2018

У меня есть массив размером 5x4 в MATLAB.

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 голосов
/ 27 сентября 2018

Будет ли MATLAB создавать (копировать) новый массив в другой части памяти и снова назначать новый адрес A?

Я бы сказал, что ответ: вероятно,и, конечно, может, но то, действительно ли это так, не обязательно указано в документации по языку (по крайней мере, не то, что я видел).

В общем, потому что Matlab - это передача по значению, копирование-write language, любая модификация данных внутри массива может привести к его перераспределению и копированию, потому что любые другие существующие ссылки на этот массив должны сохранять старое значение.Модификации «на месте» - это просто оптимизация, используемая в определенных случаях, когда Matlab может определить, что значение массива содержится в локальной области действия / рабочей области.Поэтому, если есть какие-либо другие ссылки на этот массив, хранящиеся в A, то память определенно будет перераспределена и скопирована.

Но если ваше значение массива A было ограничено этой единственной ссылкой, Matlab теоретически может сохранять ту же выделенную память для базовых значений массива и просто перетасовывать их в пределах одного и того же блока памяти, оставляя часть его неиспользованной в конце.Я сомневаюсь, что это на самом деле так, потому что это приведет к потере памяти, без какой-либо определенной точки, где это будет исправлено в будущем.

С практической точки зрения я бы предположил, что он всегда копируется в недавно выделенный блок памяти.

Вы можете протестировать конкретную версию Matlab, чтобы увидеть, так ли это в вашемнапример, проверяя адреса указателей, возвращаемые mxGetData в MEX API до и после модификации, или просматривая распределение памяти в профилировщике.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...