Как изменить массив в функции?
MATLAB - это пароль по значению. У меня есть рекурсивная функция, которая обрабатывает пиксельные соседи. Очень дорого сделать копию изображения (в моем случае два изображения) при каждом вызове функции.
Я использовал глобальные переменные для решения проблемы. Есть ли другой способ сделать рекурсивную функцию модифицировать массив?
Ответы
Ответ 1
Здесь у вас есть три варианта, но, возможно, вам не нужны какие-либо из них, поскольку Matlab использовал "copy-on-write", т.е. переменные копируются только при их изменении.
- Как упоминается @gnovice, вы можете использовать вложенную функцию. Переменные, используемые внутри вложенной функции, разделяются между вложенной функцией и включенной функцией. Вложенные функции несколько сложны для отладки и немного сложнее писать/понимать.
- Вы можете хранить свои изображения в качестве свойств объекта , который передается по ссылке.
- Вы можете писать код по-разному, чтобы не использовать рекурсивную функцию, поскольку Matlab не лучший язык для их использования. Если у вас есть доступ к панели инструментов обработки изображений, вы можете использовать такие функции, как
blockproc
, или im2col
, чтобы переписать функцию.
Наконец, если вы хотите остаться с вашей текущей схемой, я настоятельно рекомендую вместо persistent.
Ответ 2
MATLAB не всегда имеет значение pass-by-value, более новые версии MATLAB делают пересылку при некоторых обстоятельствах, см. операции на месте и более общая дискуссия о управлении памятью MATLAB в этом сообщении SO.
Без оптимизация хвостового вызова неэффективно использовать рекурсию, а MATLAB ее не знает, насколько мне известно, но каждая рекурсия можно преобразовать в цикл.
Ответ 3
Если вы сделаете свою рекурсивную функцию вложенной функцией в рамках другой функции, где хранятся данные изображения, тогда рекурсивная функция может изменять данные изображения без необходимости его передачи.
Ответ 4
Это распространенное заблуждение. Хотя sytanx MATLAB проходит по значению, он фактически не передается по значению, как в C. Интерпретатор достаточно умен, чтобы при необходимости делать копии. Таким образом, вы должны просто идти вперед и проходить по значению и видеть, возникают ли проблемы с памятью.
Как отмечали другие плакаты, вам все равно следует избегать рекурсии в MATLAB.