Подтвердить что ты не робот

Как изменить массив в функции?

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

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

4b9b3361

Ответ 1

Здесь у вас есть три варианта, но, возможно, вам не нужны какие-либо из них, поскольку Matlab использовал "copy-on-write", т.е. переменные копируются только при их изменении.

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

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

Ответ 2

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

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

Ответ 4

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

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