Как nlfilter дополняет матрицу? - PullRequest
1 голос
/ 18 апреля 2011

Я тестирую функцию, содержащую nlfilter на матрице.Для этого я создал случайную матрицу 11X11 и использую движущееся окно 7x7 с помощью nlfilter.Моя функция выглядит следующим образом:

function funct(fh)
I = rand(11,11)
ld = input('Enter the lag = ') % prompt for lag distance
fh = @dirvar,@diagvar;
A = nlfilter(I, [7 7], fh);


% 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('dirvar'), он запрашивает задержку, выбирает 4 элемента первой строки и прогрессирует элемент за элементом.С 9-го по 11-й элемент первого ряда он принимает 0 с в качестве последних элементов (автоматическое заполнение), что является ожидаемым поведением.

Но когда я запускаю funct('diagvar'), функция ведет себя так же (как в dirvar ) вместо выделения элементов по диагонали и перехода на отступы.Для 1-го ряда я ожидаю, что он выберет первый элемент из первого ряда и 3 нуля и т. Д. До конца строки;когда дело доходит до 2-й строки - 1-го элемента, это будет 2-й ряд - 1-й элемент + 1-й ряд - 2-й элемент, за которым следуют 2 нуля и т. д.

Если я просто создаю случайную матрицу порядка 11X11 и запускаюстроки из diagvar выбирает центральное значение из матрицы и прогрессирует, как и ожидалось.

Ответы [ 2 ]

2 голосов
/ 18 апреля 2011

Вы определяете fh в качестве входной переменной, но затем перезаписываете fh следующей строкой:

fh = @dirvar,@diagvar;

А что делает эта линия? Итак, у вас есть одна переменная слева и две функции в списке через запятую справа. Что с этим сделает MATLAB? Итак, первая запись @dirvar в списке через запятую будет назначена на fh, а вторая запись @diagvar будет назначена на Ничего . Следовательно, эта строка всегда устанавливает fh равным @dirvar, поэтому вы всегда получаете результат, как будто используется dirvar.

Если вы хотите выбрать одну из своих вложенных функций, введя строковый аргумент в funct, вы должны посмотреть на этот ответ, который я дал на другой вопрос SO , в частности варианты # 2 и # 3.

0 голосов
/ 18 апреля 2011

Попробуйте позвонить

funct(@diagvar)

;и удалите следующую строку:

fh = @dirvar,@diagvar;

То, что вы делаете сейчас, не меняет используемую вами функцию.

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