nlfilter:选择嵌套的子函数?

时间:2011-04-17 09:14:59

标签: matlab

MATLAB中nlfilter的语法是:

B = nlfilter(A, [m n], fun)

我正在考虑使用test函数创建一个包含多个子函数的M-File;即,我想要一个选择,每次我可以选择在fun下调用哪个子功能。

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

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

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

% Subfunction 3
function sub3
.......

是否可以概括fun,以便我可以从sub1拨打sub2sub3test

修改

我的功能:

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});

我很困惑现在的问题是什么?

2 个答案:

答案 0 :(得分:1)

如果您知道子功能的名称,则可以使用str2func

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

function test (subfunNm)

并按照以下方式致电nlfilter

B = nlfilter(A, [m n], str2func (subfunNm));

现在您可以致电test

test ('sub1')

修改

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

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

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

答案 1 :(得分:1)

查看str2func和/或函数句柄。

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