2011-04-18 6 views
1

매트릭스에 nlfilter을 포함하는 함수를 테스트하고 있습니다. 목적을 위해 무작위 11X11 매트릭스를 만들고 nlfilter의 도움으로 7x7 이동 창을 사용합니다. 난 funct('dirvar') 실행할 때'nlfilter'는 어떻게 행렬을 덧붙일 수 있습니까?

function funct(fh) 
I = rand(11,11) 
ld = input('Enter the lag = ') % prompt for lag distance 
fh = @dirvar,@diagvar; 
A = nlfilter(I, [7 7], fh); 


% Subfunction 
    function [h] = dirvar(I) 
     c = (size(I)+1)/2 
     EW = I(c(1),c(2):end) 
     h = length(EW) - ld 
    end 

% Subfunction 
    function [h] = diagvar(I) 
     c = (size(I)+1)/2 
     NE = diag(I(c(1):-1:1,c(2):end)) 
     h = length(NE) - ld 
    end 
end 

그것이 지연 요청 제 4 개 행의 요소를 선택하고, 요소가 요소 진행 다음과 같이 내 함수이다. 첫 번째 행의 9 번째 요소에서 11 번째 요소까지 예상되는 동작 인 마지막 요소 (자동 채우기)로 0이 필요합니다.

하지만 funct('diagvar')을 실행할 때 기능을 대신 대각선 요소를 선택하고 패딩가는 (dirvar에서와 같이) 동일하게 동작합니다. 첫 번째 행에 대해서는 첫 번째 행과 세 번째 행의 첫 번째 요소를 선택하고 행의 끝까지이를 선택합니다. 두 번째 행 - 첫 번째 요소는 두 번째 행 - 첫 번째 요소 + 첫 번째 행 - 두 번째 요소 다음에 두 개의 0이옵니다.

11X11의 임의의 행렬을 만들고 diagvar에서 행을 실행하면 행렬에서 중심 값이 선택되고 예상대로 진행됩니다.

답변

2

당신은 당신의 입력 변수로 fh을 정의하는,하지만 당신은 다음 행으로 fh을 덮어 :

fh = @dirvar,@diagvar; 

그리고이 줄은 무엇을하고 있는가? 자, 왼쪽에 하나의 변수가 있고 오른쪽에 comma-separated list에 두 개의 function handles이 있습니다. MATLAB은 이것을 어떻게 할 것입니까? 음, 쉼표로 구분 된 목록의 첫 번째 항목 @dirvarfh에 할당되고 두 번째 항목 @diagvar에 할당되지 않음으로 할당됩니다. 따라서이 줄 은 항상입니다. 은 @dirvar과 같으므로 dirvar이 사용되고있는 것처럼 항상 결과를 얻을 수 있습니다.

funct에 문자열 인수를 입력하여 중첩 함수 중 하나를 선택하려면 this answer I gave to another SO question, 특히 # 2 및 # 3 옵션을 확인해야합니다.

+0

옵션 # 3이 트릭을했습니다. 사실 # 2도 작동했지만 # 3을 사용했습니다. 고마워요! –

0

시도 대신

funct(@diagvar) 

를 호출; 다음 줄을 제거하십시오.

fh = @dirvar,@diagvar; 

현재 수행중인 작업은 사용중인 기능을 변경하지 않습니다.

+0

fh = @ dirvar, @ diagvar;를 제거한 후에'funct (@diagvar)'를 호출하면 오류가 발생합니다 :'??? ==> feval 사용 오류 'double'유형의 입력 인수에 대해 정의되지 않은 함수 또는 메서드 'diagvar'가 있습니다. ==> nlfilter at 61 b = mkconstarray (class feval (fun, aa (1 + rows, 1 + cols), params {:})), 0, size (a)); ==> funct 6에 오류가 있습니다. A = nlfilter (I, [7 7], fh);'. 반면에'fh = @ diagvar' 만 있고'funct (@diagvar) '를 사용하여 호출하면 함수가 완벽하게 작동합니다. –

관련 문제