Анонимные функции, вызывающие функции с несколькими форматами вывода

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

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

[row,col] = find(X);

а также

[ind] = find(X);

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

I have tried 1)

get_columns = @(x) x(2);

а также 2)

get_columns = @(x,y) y;

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

get_columns(find(x))

The first version of get_columns thinks I am calling find as [ind] = find(X) а также not as [row,col] = find(X);, while the second one complains with "Not enough input arguments".

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

8
Вы можете создать вспомогательную функцию, которая запрашивает оба выхода. См. Также stackoverflow.com/questions/3096281/& hellip;
добавлено автор Jonas, источник

2 ответы

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

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

8
добавлено

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

Кроме того, в отношении комментария о том, что «if» нельзя использовать в 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'

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

3
добавлено