Matlab — для цикла в функции анонимуса

#matlab #for-loop #anonymous-function

#matlab #для цикла #anonymous-функция

Вопрос:

Я довольно новичок в matlab, но я знаю, как выполнять как циклы for, так и анонимные функции. Теперь я хотел бы объединить их.

Я хочу написать:

sa = @(c) for i = 1:numel(biscs{c}), figure(i), imshow(biscs{c}{i}.Image), end;

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

 for i = 1:numel(biscs{c})
    figure(i)
    imshow(biscs{c}{i}.Image)
end
  

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

Ответ №1:

Анонимные функции могут содержать несколько операторов, но без явных циклов или if-предложений. Несколько операторов передаются в массив ячеек и вычисляются один за другим. Например, эта функция откроет фигуру и отобразит некоторые данные:

 fun = @(i,c){figure(i),imshow(imshow(biscs{c}{i}.Image)}
  

Однако это не решает проблему цикла. К счастью, есть ARRAYFUN. С помощью этого вы можете написать свой цикл следующим образом:

 sa = @(c)arrayfun(@(i){figure(i),imshow(biscs{c}{i}.Image)},...
         1:numel(biscs{c}),'uniformOutput',false)
  

Удобно, что эта функция также возвращает выходные данные figure и imshow , то есть соответствующие дескрипторы.

Ответ №2:

Если вы вызываете эту функцию из другой функции, вы можете определить ее в конце файла .m основной функции, а затем обратиться к ней, используя синтаксис @name. Однако это не работает с файлами сценариев, поскольку они не могут содержать вспомогательные функции.

Второй подход несколько грязный, но, тем не менее, может сработать и заключается в использовании eval STRING:

 fun = @(a,b) eval('for i = 1:a; imshow(b(i)); end');
  

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