这是我正在尝试测试更大功能的函数的一部分。
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));
可能是什么原因?
答案 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无法访问嵌套函数。要为嵌套函数构造函数句柄,必须使用函数句柄构造函数@。”