2014-06-10 2 views
-1

flow은 네 번째 차원이 항상 2 인 4D 이중 행렬입니다. 루프를 사용하지 않고이 루프를 구현하고 싶습니다.Matlab : 코드에서 루프 제거

기본적으로 3 차원의 각 색인에 대해 flow1을 크기 block-size의 정사각형 블록으로 나누고 각 블록의 4 차원에서 값의 평균을 계산 한 다음 해당 값을 다시 4 번째 해당 블록의 모든 요소에 대한 차원

일반적인 값은 [height width N block_size] = [ 480 640 100 8]입니다. block_size 모두 heightwidth

[height,width,N,~] = size(flow1); 
reduced_flow = zeros(size(flow1)); 
for ii = 1:block_size:height 
    for jj = 1:block_size:width 
     for k = 1:N 
      reduced_flow(ii:ii+block_size-1,jj:jj+block_size-1,k,1) = mean(mean(flow1(ii:ii+block_size-1,jj:jj+block_size-1,k,1),1),2); 
      reduced_flow(ii:ii+block_size-1,jj:jj+block_size-1,k,2) = mean(mean(flow1(ii:ii+block_size-1,jj:jj+block_size-1,k,2),1),2); 
     end 
    end 
end 

flow1 = round(10*rand(4,4,2,2)); 
block_size = 2; 
[flow1 reduced_flow] 

ans(:,:,1,1) = 

    6.0000 4.0000 1.0000   0 4.0000 4.0000 2.2500 2.2500 
    6.0000   0 2.0000 6.0000 4.0000 4.0000 2.2500 2.2500 
      0 5.0000 1.0000 3.0000 3.2500 3.2500 2.7500 2.7500 
    6.0000 2.0000 2.0000 5.0000 3.2500 3.2500 2.7500 2.7500 


ans(:,:,2,1) = 

    7.0000 1.0000 3.0000 4.0000 4.5000 4.5000 2.7500 2.7500 
    5.0000 5.0000 2.0000 2.0000 4.5000 4.5000 2.7500 2.7500 
    5.0000 9.0000 6.0000 9.0000 6.7500 6.7500 5.5000 5.5000 
    4.0000 9.0000 6.0000 1.0000 6.7500 6.7500 5.5000 5.5000 


ans(:,:,1,2) = 

    1.0000 9.0000 7.0000 5.0000 3.2500 3.2500 7.5000 7.5000 
    2.0000 1.0000 10.0000 8.0000 3.2500 3.2500 7.5000 7.5000 
    7.0000 10.0000 3.0000 8.0000 6.2500 6.2500 4.0000 4.0000 
    3.0000 5.0000 4.0000 1.0000 6.2500 6.2500 4.0000 4.0000 


ans(:,:,2,2) = 

    2.0000 3.0000 7.0000 7.0000 2.7500 2.7500 6.5000 6.5000 
    4.0000 2.0000 5.0000 7.0000 2.7500 2.7500 6.5000 6.5000 
    1.0000 2.0000 9.0000 6.0000 4.2500 4.2500 4.5000 4.5000 
    5.0000 9.0000 1.0000 2.0000 4.2500 4.2500 4.5000 4.5000 
+1

코드가 무엇을 설명하면 더 좋을 것입니다 –

+0

@LuisMendo 죄송합니다, 제가 알기 론, 뭔가가 떠올랐습니다. – Nishant

+0

위의 아이디어에 따르면 첫 번째 2 차원' [480, 640]'그리고 3 차원'[100]'을 무시한 4 차원'[8]'에서 평균을 계산하시오. 4 차원의 모든 값에 할당하려는 평균값입니다. 3 차원에서 어떤 일이 일어나야합니까? 무시하고 삭제 하시겠습니까? 그리고 나는 당신의 질문을 올바르게 이해하고 있습니까? –

답변

1

접근법 1

flow11 = reshape(flow1,size(flow1,1),[]); 
fun = @(block_struct) mean2(block_struct.data); 
mat1 = blockproc(flow11,[block_size block_size],fun); 
mat2 = imresize(mat1,block_size ,'nearest'); 
reduced_flow = reshape(mat2,size(flow1)); 

접근법 2

t1 = sum(reshape(sum(reshape(flow1,block_size,[])),height/block_size,block_size,[]),2)./block_size^2; 
t2 = reshape(t1,1,1,[]); 
t3 = t2(ones(1,block_size),ones(1,block_size),:,:); 
t4 = reshape(permute(t3,[1 3 2]),size(t3,1)*size(t3,3),[]); 
out = permute(reshape(t4,height,size(t4,1)/height,[]),[1 3 2]); 
reduced_flow = reshape(out,size(flow1)); 
01,235,164의 팩터임을 보장
+0

''size (flow) = [480 640 51 2]''실행 시간이 늘어났습니다. 105 초 (루프) ~ 216 초 (사용자 코드). 또한,''b = reduced_flow_loop ~ = reduced_flow_divakar; error = sum (b (:))''는''error as 3788608''을 제공합니다. – Nishant

+0

@Nishant 방금 추가 된 접근법 2를 확인하십시오. – Divakar

+0

@Nishant 오류 검사를하는 경우 'rand' 값에 대해서는 다음과 같이 부동 소수점 계산 문제를 피하기 위해 최대 차이를 사용하는 것이 좋습니다 -'err1 = reduced_flow (:) - reduced_flow2 (:); max_error = max (err1 (:)) ' – Divakar