2011-03-10 7 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

? 두 매개 변수가 정의되지 않으면 게시 된 코드가 실행되지 않습니다. – Jonas

+0

죄송합니다. 해당 행을 복사하여 붙여 넣는 것을 잊었습니다. 그것들은 각각 윈도우의 크기 (존 x 존)와 윈도우의 이동 (즉, 각 반복에서 윈도우의 움직임)을 정의하는 파라미터이다. 코드를 변경 했으므로 이제는 작동 할 것입니다. – Francesco

답변

2

Image Processing Toolbox에 액세스 할 수있는 경우 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

1

나는 이미지가 jxk, 그리고 창문이 MXN입니다 가정 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

이것은 흥미로운 해결책이지만 문제의 일부를 해결하지는 못합니다. zone = 3 및 shift = 2 (더 일반적으로 구역보다 작은 시프트를 가진 모든 창에 해당)의 이동 창이 있어야 하나의 창과 다음 창이 부분적으로 중첩됩니다 (즉, 부분적으로 같은 것을 포함합니다). 값). 이것은 C = B (:, 1 : 2 : 끝)를 사용하여 수행 할 수 없습니다. 그러나 여전히 매트릭스에서 작업하는 흥미로운 방법입니다, 감사합니다! – Francesco

1

시도 filter.

예를 들어, 5 개 요소를 통해를 윈도우 평균을 수행하는 :

는`shift``zone`과 무엇
outdata = filter([ 0.2 0.2 0.2 0.2 0.2 ], 1, indata);