Anonieme functies die functies oproepen met meerdere uitvoerformulieren

Ik probeer een anonieme functie te definiëren die een versie van een functie aanroept die meerdere uitgangen retourneert.

De functie find heeft bijvoorbeeld twee mogelijke uitvoerformulieren:

[row,col] = find(X);

en

[ind] = find(X);

Stel dat ik de eerste vorm binnen een anonieme functie wil kiezen.

I have tried 1)

get_columns = @(x) x(2);

en 2)

get_columns = @(x,y) y;

Maar als ik bel:

get_columns(find(x))

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

Is er een manier om een ​​ specifiek uitvoerformulier van een functie binnen een anonieme functie te activeren?

8
U kunt een hulpfunctie maken die om beide uitgangen vraagt. Zie ook stackoverflow.com/questions/3096281/& hellip;
toegevoegd de auteur Jonas, de bron

2 antwoord

Direct, nee. Helaas zijn er een aantal functies die ontoegankelijk zijn via anonieme functies, en toegang tot meerdere uitvoerargumenten is er een van. (De andere die ik vaak vind is dat je geen if -instructie in een anonieme functie kunt definiëren, dit lijkt meer een beperking van de Matlab-syntax te zijn dan wat dan ook.

Een vrij eenvoudige hulpfunctie kan dit echter mogelijk maken.

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

Deze functie neemt een functieafhandeling plus een reeks uitvoerindices en retourneert de geïndexeerde uitgangen.

Als je dit bestand (hopelijk beter gecomprimeerd) maakt en het op je pad plaatst, dan kun je de tweede uitgang van de functie find gebruiken door de volgende functie te definiëren

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

En nu kun je vinden dat de indexen van een array gelijk aan 1 zijn

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

En nu zou u vanuit willekeurige anonieme functies toegang moeten hebben tot alternatieve uitvoerargumenten.

8
toegevoegd

Deze functie get_outputs hierboven zou zeer nuttig kunnen zijn voor korte anonieme functies. Heel aardig.

Ook met betrekking tot de opmerking dat een "als" niet kan worden gebruikt in MATLAB, is dit slechts gedeeltelijk waar. Identiek gedrag kan eenvoudig anoniem worden geïmplementeerd. Hier is bijvoorbeeld een anonieme opmerking als:

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

Gebruik:

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

De actie die overeenkomt met de eerste echte conditie wordt uitgevoerd. Dit drukt bijvoorbeeld 'hallo' uit.

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

Toegegeven, op het eerste gezicht is het een beetje ingewikkeld, maar ik bewaar zoiets op mijn pad, zodat ik een "als" kan gebruiken in een anonieme functie. Op deze manier kunnen veel complexere anonieme functies worden gebouwd.

3
toegevoegd