开发者

nlfilter: Choosing nested subfunctions?

The syntax for nlfilter in MATLAB is:

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

I am considering creating a M-File with several subfunctions to be called using test function here; i.e., I wanted a choice such that each time I can choose what subfunction gets called under fun.

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

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

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

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

Will it be possible to generalize fun in such a way that I can call either sub1 or sub2 or sub3 from test.

EDIT

My function:

function funct(subfn)
clc;
I = rand(11,11);
ld = input('Enter the lag = ') % prompt for lag distance
fh = {@d开发者_Go百科irvar,@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 

When I run funct(1) now this is the output with error:

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

I am puzzled as to what is the problem now?


If you know the name of the subfunction, you can use str2func:

Change the test function to accept a string which holds the subfunction name:

function test (subfunNm)

And call nlfilter like this:

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

Now you can call test:

test ('sub1')

etc.

EDIT

In the case of nested functions, you can hold a cell array of the function handles, and pass in an index (instead of a string):

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

And call it using test (1) etc.


Take a look at str2func and/or function handles.

I'd personally stay away from strings to pass functions, but you might just need to use that.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜