Анонимные функции, вызывающие функции с несколькими формами вывода - PullRequest
8 голосов
/ 27 октября 2011

Я пытаюсь определить анонимную функцию, которая вызывает версию функции, которая возвращает несколько выходов.

Например, функция find имеет две возможные формы вывода:

[row,col] = find(X);

и

[ind] = find(X);

Скажем, я бы хотел выбрать первую форму внутри анонимной функции.

Я пытался 1)

get_columns = @(x) x(2);

и 2)

get_columns = @(x,y) y;

Но когда я звоню:

get_columns(find(x))

Первая версия get_columns думает, что я звоню findкак [ind] = find(X), а не как [row,col] = find(X);, а второй жалуется с "Not enough input arguments".

Есть ли способ вызвать конкретную форму вывода функции внутри ан анонимная функция ?

Ответы [ 2 ]

8 голосов
/ 09 ноября 2011

Напрямую, нет.К сожалению, есть ряд функций, которые недоступны через анонимные функции, и одним из них является доступ к множеству выходных аргументов.(Другое, что я часто нахожу, это то, что вы не можете определить оператор if внутри анонимной функции. Похоже, это ограничение синтаксиса Matlab больше, чем что-либо еще.

Однако довольно простая вспомогательная функция можетсделать это возможным.

function varargout = get_outputs(fn, ixsOutputs)
output_cell = cell(1,max(ixsOutputs));
[output_cell{:}] = (fn());
varargout = output_cell(ixsOutputs);

Эта функция берет дескриптор функции плюс массив выходных индексов и возвращает индексированные выходные данные.

Если вы создадите этот файл (надеюсь, лучше прокомментированный) и поместитепо пути, вы можете получить доступ ко второму выходу функции find, определив следующую функцию

find_2nd = @(x)get_outputs(@()find(x),2)

И теперь вы можете найти индексы массива, которые равны 1 как

>> find_2nd([4 3 2 1]==1)
ans =
    4

И теперь вы можете иметь доступ к альтернативным выходным аргументам по желанию из анонимных функций.

3 голосов
/ 06 декабря 2012

Эта функция get_outputs, описанная выше, может быть очень полезна для кратких анонимных функций. Очень мило.

Кроме того, что касается комментария о том, что в MATLAB нельзя использовать «если», это только частично верно. Идентичное поведение может быть легко реализовано анонимно. Например, вот аноним, если:

anonymous_if = @(varargin) varargin{2*find([varargin{1:2:end}], 1, 'first')}();

Использование:

out = anonymous_if(condition1, action1, condition2, action2, ...);

Выполняется действие, соответствующее первому истинному условию. Например, это печатает «привет».

anonymous_if(false, @() disp('hi'), ... % if false, print 'hi'
             true,  @() disp('hello'))  % else if true, print 'hello'

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...