2013-07-02 12 views
6

funkcja może być zdefiniowana jako @(x) x^.2 (dla np)Jak stosować warunki wewnątrz funkcji anonimowej

Jednak w przypadku, mamy funkcję, która przyjmuje inną reprezentację w różnych odstępach czasu np if abs(x)<3 fun = x^.2 else 0

Jak czy możemy użyć tej samej metody (tj. użyć @(x)) do zdefiniowania takiej funkcji.

+1

możliwy duplikat [Jak wykonać wiele instrukcji w anonimowej funkcji MATLAB?] (Http://stackoverflow.com/questions/558478/how-to-execute-multiple-statements-in-a-matlab-anonymous- funkcja) – Shai

+2

@Shai: nie zgadzam się. To pytanie dotyczy oceny wielu funkcji w pojedynczym czasie, podczas gdy chodzi o ocenę warunkową w anon (tam * jest * dupek, widziałem to, ale nie znajduję tego teraz ...) –

Odpowiedz

16

Istnieje kilka sposobów, aby to zrobić.

pomnożyć przez fałszywe:

g = @(x) (abs(x)<3) .* x.^2 

lub zdefiniować odpowiednią funkcję (najlepszy sposób naprawdę):

function y = g(x) 

    y = zeros(size(x), class(x)); 

    inds = abs(x)<3; 
    y(inds) = x(inds).^2; 

end 

lub zrobić bałagan-brzydki-nieefektywne, ale-fun rzecz i użyć inline-if:

iif = @(varargin) varargin{2 * find([varargin{1:2:end}], 1, 'first')}(); 
g = @(x) iff(... 
    abs(x)<3, x.^2, ... 
     true, 0); 
+2

Więcej wyjaśnień : Właściwa funkcja jest nawet wymagana, gdy chcesz uniknąć obliczania drugiej części, która nie zostanie wybrana; np .: 'iif (x == 0; 0; 1/x) 'tutaj' 1/x' nadal jest oceniany, nawet jeśli 'x == 0'. Jest to funkcja i matlab nadal chce przekazać wszystkie argumenty, stąd ocena. Jedynym sposobem na uniknięcie tego (i dlatego jest to najlepszy, właściwy sposób) jest użycie osobnej funkcji, która pozwala na multilinię i normalne 'if'. –

+0

@GuntherStruyf: true. Dodano "inefficnet" do opisu metody 'iif()' :) –

+0

@GuntherStruyf: ahum. To "nieefektywne". Pisanie jest trudne. –

0

Jak @Gunther wymienione w powyższych uwag, funkcja rodzajowy obsłużyć sim warunek naśladowania operatora trzeciorzędnego?: można utworzyć w celu obejścia ograniczenia, które Matlab nie pozwala warunkom wewnątrz funkcji anon (jeśli nie liczycie tej niechlujnie-brzydko-nieefektywnej, ale zabawnej wersji inline :).

Rozwiązanie zostało przedstawione za pomocą tego linku (i być może kilka innych miejsc, ale SO wróciło do mojego wyszukiwania google, więc pomyślałem, że dobrze byłoby dodać tutaj). http://www.mathworks.co.jp/matlabcentral/newsreader/view_thread/158054

zdefiniować funkcję powiedzieć IFF lub ifelse i dodać go do ścieżki Matlab.

function result = ifelse(condition,trueResult,falseResult) 
    error(nargchk(3,3,nargin)); % check correct number of input args 
    if condition 
     result = trueResult; 
    else 
     result = falseResult; 
    end 

następnie wykorzystać jak to

predict = arrayfun(@(x) ifelse(x>=0.5,1,0), inputData); 

W przypadku PO za coś takiego może być stosowany

arrayfun(@(x) ifelse(abs(x)<3,x^.2,0), data) 
0

To co wymyśliłem. Mam cases.m funkcji z następującą definicję:

function [ val ] = cases(table) 
    [rows,~] = size(table); 
    for i = drange(1:rows) 
    condition = table{i,1}; 
    if (ischar(condition) && strcmpi(condition,'else')) || feval(condition) 
     val = feval(table{rows,2}); 
     return 
    end 
    end 
    val={}; 
end 

Funkcja cases pobiera tablicę komórek z dwoma kolumnami. Każdy element jest funkcją o zerowych argumentach. Dla każdego wiersza przyjmuje on pierwszy element i jeśli jest ciągiem "else" lub funkcją, która zwraca wartość true, wywoływany jest drugi element i zwracana jest jego wartość. Jeśli żaden wiersz nie zostanie zakwalifikowany, zwracana jest pusta komórka. Elementy są funkcjami nullary zamiast wartości, więc niepotrzebne przypadki nie są oceniane.

Wtedy mogę napisać wyrażeń takim wypadku:

w=arrayfun(@(j) cases({ ... 
    @() (j==0 || j==n) @() (-1)^j/2; ... 
    'else' @() (-1)^j }), 0:n); 

ta produkuje tablicę o wartości od 0 do n z pierwszej i ostatniej wartości o połowę.

0

Aby rozwinąć link ukrywający się w odpowiedzi @ RodyOldenhuis, spójrz na Functional Programming Constructs. Ten pakiet dostarcza całkiem obszerny zestaw konstruktów funkcjonalnych.Autor wykonał także serię guest posts on the Art of MATLAB blog przedstawiającą wiele szczegółów dotyczących tej biblioteki. Jeśli nie chcesz ściągnąć całego pakietu do projektu, posty na blogu zawierają również anonimowe jednolinijki niektórych funkcji w pakiecie.

Powiązane problemy