Я сохраняю память в MATLAB путем объявления переменных, глобальных вместо того, чтобы передать их как аргументы?

В Модели Объекта C++ Stan Lippman. Это заставило C++ наконец "нажать" для меня, прежде чем это было все "волшебство". Эта книга дала мне различное настроение при приближении к новому языку программирования.

10
задан Shalom Craimer 11 August 2009 в 06:49
поделиться

4 ответа

По моему опыту, при условии, что ни один код не изменяет большие данные, использование памяти одинаково, независимо от того, используете ли вы глобальную переменную или входной аргумент, как говорится в документации Matlab. . Дополнительная информация содержится в сообщении в блоге сотрудника MathWorks.

Существует довольно много фольклора о проблемах производительности в Matlab, и не все из них правильные. Внутреннее устройство Matlab немного изменилось. Возможно, в предыдущей версии лучше использовать глобальную переменную.

6
ответ дан 3 December 2019 в 22:01
поделиться

Этот ответ может быть несколько косвенным, но здесь стоит упомянуть еще одну тему - использование вложенных функций для управления памятью.

Как уже было установлено в другие ответы, нет необходимости в глобальных переменных, если данные, которые вы передаете функции, не изменяются (поскольку они будут переданы по ссылке). Если он изменен (и, таким образом, передается по значению), использование глобальной переменной вместо этого сэкономит вам память. Однако глобальные переменные могут быть несколько "неотесанными" по следующим причинам:

  • Вы должны делать объявление вроде global varName везде, где они вам нужны.
  • Это может быть концептуально немного беспорядочно пытаться отслеживать, когда и как они были изменены, особенно если они распределены по нескольким m-файлам.
  • Пользователь может легко взломать ваш код с помощью неудачно размещенной clear global , которая очищает все глобальные переменные.

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

function myfun

  A = magic(500);
  setrowval(400, 0);
  disp('The new value of A(399:401,1:10) is')
  A(399:401,1:10)

  function setrowval(row, value)
    A(row,:) = value;
  end

end

В этом примере функция setrowval вложена внутри функции ] myfun . Переменная A в рабочей области myfun доступна в setrowval (как если бы она была объявлена ​​ глобальной в каждом из них). Вложенная функция изменяет эту общую переменную, таким образом избегая выделения дополнительной памяти. Вам не нужно беспокоиться о том, что пользователь случайно что-то очистит, и (на мой взгляд) это немного чище и проще, чем объявление глобальных переменных.

4
ответ дан 3 December 2019 в 22:01
поделиться

Решение мне кажется немного странным. Как вы уже выяснили, это не должно существенно влиять на использование памяти, если вызываемая функция не изменяет массив данных. Однако,

3
ответ дан 3 December 2019 в 22:01
поделиться

Думаю, вы в значительной степени ответили на свой вопрос, но здесь было бы неплохо еще пара ссылок:

Я снял видео по этому поводу:

http: //blogs.mathworks .com / videos / 2008/09/16 / new-location-and-memory-allocation /

Подобно тому, о чем здесь говорила Лорен:

http://blogs.mathworks.com/loren/2006/05 / 10 / управление-памятью-для-функций-и-переменных /

-Dogu

3
ответ дан 3 December 2019 в 22:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: