Sliding neighborhood - how to vectorize?
    8 visualizzazioni (ultimi 30 giorni)
  
       Mostra commenti meno recenti
    
    Alex Kurek
 il 25 Set 2015
  
    
    
    
    
    Modificato: Joseph Cheng
      
 il 2 Ott 2015
            Dear all,
Can you please help me to vectorize (or speed-up somehow else) this code? Below is the original (parfor) version and the vectorized one, but its not working (the image is different). How to vectorize this, where is the error? The inner loop (two lines) is executed 47 bln times in my code, so any speed up is a good thing.
noised = imnoise(zeros(230,230), 'salt & pepper', 0.2); 
imshow(noised, []); impixelinfo 
%%Oryginal
myTempModel = zeros(1, 230); 
signalInBlock = zeros(230, 230);
tic
parfor i = 1 : 199 
    myTemp = myTempModel; 
    ii=i+31;
    for j = 1 : 199 
        block = noised( i:ii,  j:j+31); 
        myTemp(j+15) = sum(block(:)); 
    end 
    signalInBlock(i+15, :) = myTemp; 
end 
toc
imshow(signalInBlock,[]); impixelinfo 
%%Vectorized, but not working
signalInBlock = zeros(230, 230);
tic 
i = 1:1:199; 
j = 1:1:199; 
signalInBlock(i+15, j+15) = sum(sum(noised(i:i+31, j:j+31))); 
toc
imshow(signalInBlock,[]); impixelinfo
Best regards, Alex
0 Commenti
Risposta accettata
  Joseph Cheng
      
 il 25 Set 2015
        why not use conv2?
signalInBlock2 = zeros(230, 230);
tic 
temp = conv2(noised,ones(32,32),'valid');
signalInBlock2(16:214,16:214)=temp;
figure,imshow(signalInBlock2,[]); 
toc
when running your code the parfor took 0.327807 seconds, the conv2 took 0.131374 seconds
3 Commenti
  Joseph Cheng
      
 il 2 Ott 2015
				
      Modificato: Joseph Cheng
      
 il 2 Ott 2015
  
			for that conv2 is for a 2D matrix if my memory of the documentation is correct. you can write a for loop to go through each "layer" of signalblock. which if large the parallel tool box can make if faster if it is really slow since each "layer" is not dependent on each other. As for GPU processing, i'm still dabbling in using the GPU so i'm not sure.
Più risposte (1)
  Alex Kurek
 il 25 Set 2015
        2 Commenti
  Joseph Cheng
      
 il 25 Set 2015
				
      Modificato: Joseph Cheng
      
 il 25 Set 2015
  
			good catch, I stuck the figure portion towards the end to visually compare the parfor output and the conv2 output. forgot to copy the timing results without the figure when replying to you
  Image Analyst
      
      
 il 25 Set 2015
				conv2() is highly optimized, especially for separable kernels like you're using (just a flat box filter). You won't find anything faster. You could compare it with imfilter() if you want - it's similar.
Vedere anche
Categorie
				Scopri di più su Parallel Computing Toolbox in Help Center e File Exchange
			
	Prodotti
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!


