2011-04-17 23 views
0

這是我嘗試測試更大功能的函數的一部分。feval錯誤nlfilter,清除變量的引用

function funct(subfn) 
clear all; % this is now removed 
clc; 
I = rand(11,11); 
ld = input('Enter the lag = ') % prompt for lag distance 
A = nlfilter(I, [7 7], str2func(subfn)); 


% 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 

如果我刪除clear all語句,則出現以下錯誤,

Enter the lag = 1 

ld = 

    1 

??? Error using ==> feval 
Undefined function or method 'dirvar' for input arguments of type 'double'. 

Error in ==> nlfilter at 61 
b = mkconstarray(class(feval(fun,aa(1+rows,1+cols),params{:})), 0, size(a)); 

Error in ==> funct at 5 
A = nlfilter(I, [7 7], str2func(subfn)); 

忽略這一部分,因爲我現在已經刪除clear all聲明如下答覆建議。

Enter the lag = 1 

ld = 

    1 

??? Reference to a cleared variable subfn. 

Error in ==> funct at 6 
A = nlfilter(I, [7 7], str2func(subfn)); 

可能是什麼原因: 當我運行funct('dirvar')我與這個錯誤招呼?

回答

1

請勿(即從不)將clear all放入函數中。 subfn被定義爲函數調用,清除所有移除此定義。請記住,函數有自己的工作空間,它與命令行所顯示的基本工作空間不同。因此,所有clear all可以爲你做的是一團糟。

編輯

由於STR2FUNC不允許您構造函數從嵌套函數處理,你可能需要使用一個switch/case塊選擇功能,即

function funct(subfn) 

%# construct the right handle 
switch subfn 
case 'dirvar' 
    subfn = @dirvar; 
case 'diagvar' 
    subfn = @diagvar; 
otherwise 
    error('subfunction %s not defined',subfn) 
end 

I = rand(11,11); 
ld = input('Enter the lag = ') % prompt for lag distance 
A = nlfilter(I, [7 7], subfn); 
1

你清除所有語句清除函數'subfn'的輸入參數。這是預期的行爲。

根據str2func docs,「嵌套函數不能被str2func訪問,要構造嵌套函數的函數句柄,必須使用函數句柄構造函數@。

+0

謝謝你指出正確的方向! – 2011-04-17 13:34:07