nlfilter: выбор вложенных подфункций? - PullRequest
0 голосов
/ 17 апреля 2011

Синтаксис для nlfilter в MATLAB:

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

Я рассматриваю возможность создания M-файла с несколькими подфункциями, которые будут вызываться с использованием функции test; то есть я хотел такой выбор, чтобы каждый раз, когда я мог выбирать, какая подфункция вызывается в 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, либо sub2, либо sub3 из test.

EDIT

Моя функция:

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 ]

1 голос
/ 17 апреля 2011

Посмотрите на str2func и / или функциональные маркеры.

Лично я бы держался подальше от строк для передачи функций, но вам, возможно, просто нужно использовать это.

1 голос
/ 17 апреля 2011

Если вам известно имя подфункции, вы можете использовать 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) и т. д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...