простой фильтр скользящего окна в Matlab


person WisaF    schedule 02.11.2011    source источник
comment
Если вы искали минимум внутри окна, вы могли бы использовать imerode, но, к сожалению, он также есть в наборе инструментов для обработки изображений.   -  person Jonas    schedule 02.11.2011
comment
другой похожий вопрос с хорошими ответами: Как выбрать n элементов последовательности в окнах m? (матлаб)   -  person Amro    schedule 09.11.2011


Ответы (2)


Вот один очень простой и быстрый способ сделать это:

>> min([A(1:(end-2)); A(2:(end-1)); A(3:end)], [], 1)

ans =

     2     2     2     3     3     3     5     8

РЕДАКТИРОВАТЬ: Поскольку вам нужна полная функция...

function running_min = running_min(x, k)

xrep = repmat(x, 1, k);
xrep = reshape([xrep zeros(1, k)], length(x)+1, k);
running_min = min(xrep, [], 2)';
running_min = running_min(1:end-k);
person John Colby    schedule 02.11.2011
comment
Спасибо, но это работает только для приведенного выше примера, когда k=3. Мне нужна функция, которая принимает k в качестве входных данных. - person WisaF; 02.11.2011
comment
Понизить? Расширение банальное. Я думал, что оставлю это тебе. См. правку выше. - person John Colby; 02.11.2011
comment
Я не минусовал (даже не думаю, что смогу). Расширение не очевидно для меня. Спасибо за разработку. Я до сих пор не понимаю, как ввести произвольную векторную функцию, но это очень помогает. Спасибо. - person WisaF; 02.11.2011
comment
Не беспокойтесь... это полностью моя ошибка. Удачи! - person John Colby; 02.11.2011

Упомянутый вами post дал общее решение для создания скользящие окна (вы можете контролировать: перекрывающиеся и отдельные, шаг слайда, количество перекрытий, размер окон)

В вашем случае это намного проще и может быть легко выполнено с помощью HANKEL:

x = [13 14 2 14 10 3 5 9 15 8];
idx = hankel(1:3, 3:length(x))
min( x(idx) )

Если вы хотите создать повторно используемое решение:

function y = myFilter(x,k,fcn)
    idx = hankel(1:k, k:length(x));
    y = cellfun(fcn, num2cell(x(idx),1));
end

который мы используем как:

x = [13 14 2 14 10 3 5 9 15 8];
y = myFilter(x, 3, @(x)min(x))

Примечание. Я использую CELLFUN на тот случай, если fcn не может работать с размерами в векторной форме...

person Amro    schedule 09.11.2011