фекальная ошибка nlfilter, ссылка на очищенную переменную - PullRequest
0 голосов
/ 17 апреля 2011

Вот часть функции, которую я пытаюсь проверить для более крупной функции.

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

В чем может быть причина?

Ответы [ 2 ]

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

Ваш оператор очистки всех очищает входной параметр для функции 'subfn'.Это ожидаемое поведение.

Согласно документации str2func , «Вложенные функции недоступны для str2func. Чтобы создать дескриптор функции для вложенной функции, необходимо использовать конструктор дескриптора функции, @."

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

НЕ (то есть никогда) не помещайте clear all внутри функции.subfn определяется как вызываемая функция, очистить все удаляет это определение.Помните, что функция имеет свое собственное рабочее пространство, которое отличается от базового рабочего пространства, видимого в командной строке.Таким образом, все, что 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...