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

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

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

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-clauses. Несколько операторов передаются в массиве ячеек и оцениваются один за другим. Например, эта функция откроет фигуру и закроет некоторые данные:

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. Однако это не работает из файлов script, поскольку они не могут содержать вспомогательные функции.

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

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

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