arrays - Matlab: Remove loop from code -


flow 4d double matrix fourth dimension 2. want implement loop without using loops.

essentially , each index in third dimension,, want divide flow1 square blocks of size block-size, calculate mean of values in fourth dimension of each block, assign values respective fourth dimension elements in block .

typical values [height width n block_size] = [ 480 640 100 8] . guaranteed block_size factor of both height , width

[height,width,n,~]  = size(flow1); reduced_flow = zeros(size(flow1)); ii = 1:block_size:height     jj = 1:block_size:width         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 

example

 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 

approach 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)); 

approach 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)); 

Comments

Popular posts from this blog

database - VFP Grid + SQL server 2008 - grid not showing correctly -

jquery - Set jPicker field to empty value -

.htaccess - htaccess convert request to clean url and add slash at the end of the url -