#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');
Было бы здорово, если бы файлы сценариев могли каким-то образом разрешать определение вспомогательных функций, но это маловероятно.