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