2011-04-18 157 views
1

我正在測試矩陣上包含nlfilter的函數。爲此,我創建了一個隨機11X11矩陣,並在nlfilter的幫助下使用7x7移動窗口。我的功能如下:'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 

當運行funct('dirvar')它要求滯後,選擇第一行的4個元素,並通過元件前進元件。從第一行的第9到第11個元素,它將0作爲最後的元素(自動填充),這是預期的行爲。

但是,當我運行funct('diagvar')函數行爲相同(如在dirvar),而不是對角線選擇元素和填充。對於第一行,我期望它從第一行和三個零中選擇第一個元素,依此類推直到行尾;當涉及到第二行時 - 第一個元素將是第二行 - 第一個元素+第一行 - 第二個元素後面跟着2個零等等。

如果我剛創建順序11×11個的隨機矩陣並運行diagvar它從矩陣中選擇的中心值和進步如預期線。

回答

2

您定義fh作爲輸入變量,但你覆蓋fh有以下行:

fh = @dirvar,@diagvar; 

,什麼是這一行做什麼?那麼,左側有一個變量,右側有一個comma-separated list有兩個function handles。 MATLAB會用這個做什麼?那麼,在逗號分隔列表中的第一個條目@dirvar將被分配到fh,而且第二條目@diagvar將被分配到什麼。因此,這條線總是fh等於@dirvar,這就是爲什麼你總是得到一個結果,就好像dirvar正在使用。

如果你想通過輸入一個字符串參數到funct來選擇一個嵌套函數,你應該看看this answer I gave to another SO question,特別是選項#2和#3。

+0

選項#3有竅門。事實上#2也有效,但我用#3。非常感謝! – 2011-04-18 14:39:11

0

嘗試調用

funct(@diagvar) 

代替;並刪除以下行:

fh = @dirvar,@diagvar; 

你現在在做什麼,不會改變你正在使用的功能。

+0

如你所說,如果我叫'本功能(@diagvar)''刪除FH = @ dirvar,@ diagvar後;',是導致錯誤:'???錯誤使用==> feval 對於'double'類型的輸入參數,未定義函數或方法'diagvar'。 錯誤==> nlfilter在61 B = mkconstarray(類(feval(樂趣,AA(1個+行,1個+ COLS),則params {:})),0,大小的(a)); 錯誤==>本功能在6 A = nlfilter(I,[7 7],FH);'。另一方面,如果我只有'fh = @ diagvar',並且使用'funct(@diagvar)'調用,則該函數可以完美工作。 – 2011-04-18 12:36:56