2011-03-10 73 views
1

我想写一个“加权移动窗口”,没有嵌套循环以提高速度。 我已经尝试使用arrayfun而没有获得令人兴奋的结果,但也许我做错了。Matlab - 移动窗口,避免嵌套循环

该窗口在每个位置(存储在B中)具有不同的权重,并应叠加在矩阵A上,返回位于窗口内的矩阵A的值,乘以该位置窗口的权重(读取从B)。另外,窗口可以重叠在另一个上,在这种情况下应该保持最大值。 最后,窗口的尺寸和移位应该是函数的参数。

它看起来更困难,它实际上是,那么我告诉你,我想提高代码:

A = reshape([1:35],7,5)'; % values matrix 
B = [1:3;4:6];    % window s weight matrix 

% matrices size 
[m n] = size(A); 
[a b] = size(B); 

% window s parameters 
shift = 2;     % window s movement at each iteration 
zone = 3;     % window s size (zone x zone) 

% preallocation 
C = ones(m,n);    % to store the right weight to be applied in each position 

% loop through positions and find the best weight when they overlap 
for i=1:m 
    for j=1:n 
     C(i,j) = max(max(B(max(round((i-zone)/shift)+1,1) : min(ceil(i/shift),a) , max(round((j-zone)/shift)+1,1) : min(ceil(j/shift),b)))); 
    end 
end 

% find the output of the windows 
result = C.*A; 

我希望我自己清楚,但如果你需要更多的细节请询问。 预先感谢您的帮助!

+0

什么是'zone'和'shift'?发布的代码将不会运行,除非定义了这两个参数。 – Jonas 2011-03-10 17:56:56

+0

对不起,我忘了复制并粘贴这些行。它们是分别定义窗口尺寸(区域x区域)和窗口移位(即:每次迭代中窗口移动)的参数。 我已经更改了代码,现在它应该可以工作。 – Francesco 2011-03-10 18:15:01

回答

2

如果您有权访问图像处理工具箱,您需要查看如何perform sliding neighborhood operations。具体而言,我认为功能NLFILTER可以用来实现你想要的结果:

A = reshape([1:35],7,5)'; %'# Matrix to be filtered 
B = [1:3;4:6];    %# Window weights 
result = nlfilter(A,[2 3],@(M) max(M(:).*B(:))); 
+0

谢谢你的快速回答。 对于shift = 1,滑动邻域操作将会很好,但在我看来,没有办法选择自定义轮班。 – Francesco 2011-03-10 18:10:08

1

我会用im2col.假设你的形象是拮新康,和你的窗口的步骤为,您将获得为Mn矩阵x(j-m + 1)*(k-n + 1)。然后,你可以把所有其他列。

示例代码:

%A = your_image 
B = im2col(A, [m n],'sliding'); 
C = B(:,1:2:end); 

还有你的滑动窗口与 “变速2”。

+0

这是一个有趣的解决方案,但并未解决部分问题。我应该有一个移动窗口,区域= 3,移动= 2(更一般地说,对于每个移动窗口小于区域的窗口都是如此),一个窗口和下一个窗口将部分叠加(即:包含部分相同值)。这不能用C = B(:,1:2:end)来完成。但是在矩阵上工作仍然是一个有趣的方式,谢谢! – Francesco 2011-03-31 16:43:13

1

尝试filter

例如,做一个窗口平均超过5个元素:

outdata = filter([ 0.2 0.2 0.2 0.2 0.2 ], 1, indata);