Matlab nlfilter:选择嵌套的子函数?

Matlab nlfilter:选择嵌套的子函数?,matlab,Matlab,MATLAB中的nlfilter语法为: B=nlfilter(A[mn],fun) 我正在考虑创建一个M文件,其中包含几个子函数,这些子函数将在此处使用test函数调用;i、 例如,我想要一个选择,这样每次我都可以选择在fun下调用哪个子函数 % Main Function function test B = nlfilter(A, [m n], fun) % Subfunction 1 function sub1 ....... % Subfunction 2 function sub2

MATLAB中的
nlfilter
语法为:

B=nlfilter(A[mn],fun)

我正在考虑创建一个M文件,其中包含几个子函数,这些子函数将在此处使用
test
函数调用;i、 例如,我想要一个选择,这样每次我都可以选择在
fun
下调用哪个子函数

% Main Function
function test
B = nlfilter(A, [m n], fun)

% Subfunction 1
function sub1
.......

% Subfunction 2
function sub2
.......

% Subfunction 3
function sub3
.......
有没有可能概括一下
fun
,这样我就可以从
test
调用
sub1
sub2
sub3

编辑

我的职能:

function funct(subfn)
clc;
I = rand(11,11);
ld = input('Enter the lag = ') % prompt for lag distance
fh = {@dirvar,@diagvar};
feval(fh{subfn});
A = nlfilter(I, [7 7], 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 
当我现在运行
funct(1)
时,这是带有错误的输出:

Enter the lag = 1

ld =

     1

??? Input argument "I" is undefined.

Error in ==> funct>dirvar at 12
        c = (size(I)+1)/2

Error in ==> funct at 6
feval(fh{subfn});

我不知道现在出了什么问题?

如果您知道子函数的名称,可以使用
str2func

更改
test
函数以接受包含子函数名称的字符串:

function test (subfunNm)
然后像这样调用
nlfilter

B = nlfilter(A, [m n], str2func (subfunNm));
现在您可以调用
test

test ('sub1')
等等

编辑

对于嵌套函数,可以保存函数句柄的单元格数组,并传入索引(而不是字符串):


并使用
test(1)
等调用它。

查看
str2func
和/或函数句柄


我个人会远离字符串来传递函数,但您可能只需要使用它。

我不确定我是否理解您的问题-在每次调用中提供所需的函数句柄有什么错:
B=nlfilter(A,[mn],@sub1)
等等?如果我用必要的参数调用
nlfilter
,您所说的就行了。但是,当我调用
test
时,我实际上没有选择
sub1
sub2
sub3
的选项。可能重复的我请求您不要将此问题作为的“完全重复”来结束,因为我在实施类似于此处讨论的建议时会出现错误。我还编辑了带有错误的问题。正如错误消息所说,
输入参数“I”未定义。
-您必须向函数提供输入参数
I
feval(fh{subfn},I)传递函数时远离字符串有什么具体原因吗?在速度或其他方面存在缺点?只是美观:字符串用于存储字符数组,函数句柄用于指向函数。因此,函数句柄会尖叫“嘿,我将被用作函数”,而字符串可能是任何东西。刚刚发现“str2func无法访问嵌套函数。若要为嵌套函数构造函数句柄,必须使用函数句柄构造函数@.”。无论如何,我会尝试使用函数句柄。是的,你应该使用非嵌套函数。。。我假设您的子函数不是嵌套的(如您问题中的代码),我编辑了我的答案以包含嵌套函数的情况。我添加了我正在处理的代码部分以及我在对我的问题进行编辑时遇到的错误。
function test(fnInd)

fh = {@f1,@f2,@f3};
feval(fh{fnInd});

    function f1
        disp('f1')
    end

    function f2
        disp('f2')
    end

    function f3
        disp('f3')
    end
end