Как изменить массив в функции? - PullRequest
14 голосов
/ 09 ноября 2010

MATLAB является языком передачи по значению.У меня есть рекурсивная функция, которая обрабатывает соседей пикселей.Делать копию изображения (в моем случае два изображения) очень дорого при каждом вызове функции.

Я использовал глобальные переменные для решения проблемы.Есть ли другой способ заставить рекурсивную функцию модифицировать массив?

Ответы [ 4 ]

10 голосов
/ 09 ноября 2010

У вас есть три варианта, но, возможно, вам не нужен ни один из них, так как Matlab использовал «копирование при записи», т. Е. Переменные копируются только при их изменении.

  1. Как упоминается @ gnovice , вы можете использовать вложенную функцию . Переменные, используемые внутри вложенной функции, являются общими для вложенной функции и включающей функции. Вложенные функции несколько сложны в отладке и немного сложнее в написании / понимании.
  2. Вы можете сохранить ваши изображения в качестве свойств объекта handle , который передается по ссылке.
  3. Вы можете писать код по-разному, чтобы не использовать рекурсивную функцию, поскольку Matlab не лучший язык для их использования. Если у вас есть доступ к набору инструментов обработки изображений, вы можете использовать такие функции, как blockproc или im2col, чтобы переписать функцию.

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

6 голосов
/ 09 ноября 2010

MATLAB не всегда передается по значению, более новые версии MATLAB при некоторых обстоятельствах передают по ссылке, см. Операции на месте и более общее обсуждение управления памятью MATLAB в этом посте .

Без оптимизации хвостового вызова неэффективно использовать рекурсию, и, насколько мне известно, в MATLAB ее нет, но каждая рекурсия может быть преобразована в цикл .

3 голосов
/ 09 ноября 2010

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

2 голосов
/ 10 ноября 2010

Это распространенное заблуждение. Хотя sytanx в MATLAB передается по значению, он фактически не передается по значению, как в C. Интерпретатор достаточно умен, чтобы делать копии только при необходимости. Так что вам нужно просто перейти к следующему значению и посмотреть, не возникнут ли у вас проблемы с памятью.

Как отмечали другие авторы, вам все равно следует избегать рекурсии в MATLAB.

...