2012-10-22 7 views
1

Я пытаюсь написать простой код, который будет генерировать сумму большого окна и делить на сумму маленького рабочего окна, чтобы получить отношение энергии.Вложенные forloops для запуска функции скользящего окна для MATLAB

моего код выглядит в MATLAB

S   = data1; 
[nt,ntraces] = size(S); 

!Create sliding windows for First Break Picking: 

!define a window length 
!for large Window 
nl = 300    
!for small running Window 
ns = 50 
! tolerance/Fudge Factor 
beta = 0.0000 



for i_slide = 1:nt-nl 
for i_large = i_slide:(i_slide+nl) 
    large_window(i_large) = sum(S(i_large).^2)'; 


    for i_small = i_slide+ns:i_slide+nl 
     small_window(i_small) = sum(S(i_small).^2)'; 
    end 

end 

ER(i_slide) = small_window/(large_window + beta); 
end 

Проблемы я имею что мое маленькое работает окно не индексирует правильно а также не работают на сумму вдоль всей большой длиной окна при максимальном слайде.

любые идеи, как я могу преодолеть эту проблему?

+0

Почему вы используете «!» вместо «%» для комментариев? Я почти уверен, что «!» попытается запустить следующую строку в виде команды на вашей родной оболочке ОС. – dinkelk

+0

Этот код выглядит неправильно. Какова ваша цель? Для одного большого окна, на что вы хотите разделить его? Вы получите много маленьких окон в одном большом, поэтому вы не можете просто разделить одно число на многие. – angainor

+0

игнорировать восклицательные знаки. просто ошибка на моем конце. – user1764525

ответ

0

В общем, проблема, которую вы действительно пытаетесь решить, кажется, является общей 2-D (или 1-D?) Сверткой. Для этого вы можете использовать функцию conv или conv2 MATLAB (или фильтр или imfilter, если у вас есть панель инструментов обработки изображений). Если вам нужно, чтобы написать двухмерную функцию свертки, я бы не попробовал написать одну, которая делает две свертки, и принимает соотношение. Вместо этого напишите простую функцию свертки: my_conv и запустите ее дважды и возьмите коэффициент. например, вы пытаетесь написать:

output = my_double_conv(data,smallFilt,bigFilt); %this does ratios 

Я не думаю, что это хорошая идея в целом. Не делай этого. У

output = my_conv(data,smallFilt) ./ my_conv(data,bigFilt); 

Вы мог бы увидеть некоторые преимущества скорости от не имеющих индексировать все два раза в my_double_conv, но если вычислительные проблемы ваш вопрос, вы не должны писать свою собственную свертку в первую очередь; вместо этого вы должны использовать свертки БПФ или свертки с интегральным изображением (например, http://hebb.mit.edu/courses/9.29/2004/readings/c13-1.pdf или http://en.wikipedia.org/wiki/Summed_area_table)

При этом ваш код имеет несколько проблем. Вы пробовали отладку с отладчиком MATLAB?

Например, это явно не так, поскольку i_small является индексом скаляр:

for i_small = i_slide+ns:i_slide+nl 
    small_window(i_small) = sum(S(i_small).^2)'; 
end 

Эта сумма не собирается «сумму» за что-нибудь, так как i_small будет скалярная ...

вы хотите:

small_window= S(i_slide+ns:i_slide+nl); 
small_window_sum = sum(small_window.^2); 

отметить также, что для матричных операций поэлементно, как:

small_window/(large_window + beta);

Где small_window и large_window являются скаляры, вы хотите:

small_window./(large_window + бета); %Обратите внимание "."

+0

Даже если вам не нужна настоящая родовая свертка и просто нужна энергия в прямоугольных областях, я бы почти гарантировал, что встроенные функции MATLAB будут намного быстрее, чем любой двойной ответ на цикл, который вы можете написать. – Pete

Смежные вопросы