Matlab - цикл для функции анонимуса - PullRequest
16 голосов
/ 14 апреля 2011

Я довольно новичок в 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.

Ответы [ 2 ]

18 голосов
/ 14 апреля 2011

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

9 голосов
/ 14 апреля 2011

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

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

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

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

...