嵌套for循环以运行MATLAB的滑动窗口函数

时间:2012-10-22 06:51:57

标签: matlab nested-loops

我正在尝试编写一个简单的代码,它将生成一个大窗口的总和,并除以小运行窗口的总和,以获得能量比。

我的代码在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

我遇到的问题是我的小型运行窗口没有正确索引,也没有在最大幻灯片的整个大窗口长度上运行总和。

我能如何克服这个问题?

1 个答案:

答案 0 :(得分:0)

一般来说,你真正试图解决的问题似乎是一般的2-D(或1-D?)卷积。您可以使用MATLAB的conv或conv2函数(或过滤器或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中将所有内容编入索引两次,但如果计算问题是你的问题,那么你不应该首先编写自己的卷积;相反,你应该使用FFT卷积或积分图像卷积(例如,http://hebb.mit.edu/courses/9.29/2004/readings/c13-1.pdfhttp://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 + beta); %注意“。”