feval error nlfilter,引用已清除的变量

时间:2011-04-17 13:12:18

标签: matlab

这是我正在尝试测试更大功能的函数的一部分。

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声明。 当我运行funct('dirvar')时,我遇到了这个错误:

Enter the lag = 1

ld =

     1

??? Reference to a cleared variable subfn.

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

可能是什么原因?

2 个答案:

答案 0 :(得分:1)

不要(即从不)将clear all放入函数中。 subfn定义为调用函数,clear all删除此定义。请记住,函数有自己的工作空间,这与命令行看到的基础工作空间不同。因此,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 :(得分:1)

你的clear all语句清除函数'subfn'的输入参数。这是预期的行为。

根据str2func docs,“str2func无法访问嵌套函数。要为嵌套函数构造函数句柄,必须使用函数句柄构造函数@。”