2013-07-02 3 views
6

익명 함수 내에서 조건을 사용하는 방법 @(x) x^.2 (예 : 용)함수는 다음과 같이 정의 할 수있다

그러나 경우에, 우리는 예를 들어 서로 다른 간격에 서로 다른 표현을받는 함수가 있습니다 if abs(x)<3 fun = x^.2 else 0

어떻게 우리는 같은 방법을 사용하여 (나는 @(x)을 사용한다) 그러한 함수를 정의 할 수 있는가?

+1

가능한 중복 [MATLAB 익명 함수에서 여러 명령문을 실행하는 방법?] (http://stackoverflow.com/questions/558478/how-to-execute-multiple-statements-in-a-matlab-anonymous- 함수) – Shai

+2

@Shai : 동의하지 않습니다. 이 질문은 한 마디로 여러 함수를 평가하는 것에 관한 것인데, 이것은 anon에서의 조건부 평가에 대한 것입니다 (거기에 * 속는 사람, 나는 그것을 보았지만 지금은 찾지 못했습니다 ...) –

답변

16

몇 가지 방법이 있습니다. 거짓에 의해

곱하기 :

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

또는 적절한 함수를 정의 (정말 가장 좋은 방법) :

function y = g(x) 

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

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

end 

또는 재미 추한 비효율적-지저분한-하지만-일을하고를 사용 inline-if :

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

추가 설명 : 선택되지 않은 다른 부분의 계산을 피하려면 올바른 기능이 필요합니다. 예 :'iif (x == 0; 0; 1/x) '여기서'1/x'는'x == 0'이라하더라도 여전히 평가됩니다. 함수이고 matlab은 여전히 ​​모든 인수를 전달하기를 원하므로 평가합니다. 이것을 피하는 유일한 방법은 여러 함수와 보통의'if'를 허용하는 별도의 함수를 사용하는 것입니다. –

+0

@GuntherStruyf : true. 'iif()'메소드의 설명에 "비효율적 인"것을 추가했습니다. –

+0

@GuntherStruyf : ahum. 그것은 "비효율적"입니다. 타이핑은 어렵다. –

0

@Gunther가 위에서 언급 한 것처럼, sim 3 차 연산자를 모방하는 조건 : Matlab이 anon 함수 내부에서 조건문을 허용하지 않는다는 한계를 뛰어 넘기 위해 만들 수 있습니다 (지저분하고 불편하지만 재미있는 인라인 버전을 포함하지 않는 경우 :).

이 링크를 통해 해결책이 제시되었지만 (아마도 다른 몇몇 장소가 있지만 Google 검색의 최상위에 있으므로 여기에 추가하는 것이 좋을 것이라고 생각했습니다). http://www.mathworks.co.jp/matlabcentral/newsreader/view_thread/158054

함수가 ifelse 또는 IFF에 말과의 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 

는 다음 OP의 경우이

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

처럼 사용, 이런 일이 내가 생각 해낸 것입니다

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

사용할 수있다.

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 

함수 cases 두 개의 열을 가진 셀 어레이를 취 I는 다음의 정의와 cases.m 기능을 갖는다. 각 요소는 인수가 0 인 함수입니다. 각 행에 대해 첫 번째 요소를 취하고 'else'문자열 또는 true 값을 반환하는 함수이면 두 번째 요소가 호출되고 해당 값이 반환됩니다. 행이 한정되지 않으면 빈 셀이 반환됩니다. 요소는 값 대신 무효 함수이므로 불필요한 경우는 평가되지 않습니다.

이어서이 같은 경우, 식을 작성할 수

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

이 제 1 및 마지막 절반 값 0에서 N 값의 어레이를 생성한다.

0

@ RodyOldenhuis의 대답에 숨어있는 링크를 확장하려면 Functional Programming Constructs을보십시오. 이 패키지는 꽤 포괄적 인 기능 구성을 제공합니다.저자는 또한 guest posts on the Art of MATLAB blog 일련의 작업을 통해이 라이브러리의 많은 세부 정보를 보여줍니다. 전체 패키지를 프로젝트로 가져 오지 않으려는 경우 블로그 게시물에는 패키지에있는 일부 기능의 익명 한 줄이 포함됩니다.

관련 문제