Avoiding unnecessary for loops
    7 visualizzazioni (ultimi 30 giorni)
  
       Mostra commenti meno recenti
    
How do I do this without the loops in a few lines?
S = zeros(100,100);
sig = 0.05;
for i = 1:100
      for j = 1:100
          S(i,j) = exp(-norm(D(i,:)-D(j,:),'fro')/sig);
      end
  end
2 Commenti
  Jos (10584)
      
      
 il 7 Mar 2018
				Note that S will be symmetric with zeros on the diagonal, as norm(x) = norm(-x), so you can let j run from i+1 to 100 to save time.
Since norm is not vectorized it is hard to get rid of the for-loops at all.
Risposta accettata
  Jan
      
      
 il 7 Mar 2018
        
      Modificato: Jan
      
      
 il 7 Mar 2018
  
      These are a few lines already. The mos expensive is the exp call, so you save the most time with using the symmetry (as mentioned by Jos already):
S = zeros(100,100);
sig = 0.05;
for i = 1:100
   for j = i+1:100
      S(i,j) = exp(-norm(D(i,:) - D(j,:)) / sig);
      S(j,i) = S(i,j);
   end
end
You can try if it is faster to replace norm by:
for i = 1:100
   v = D(i, :);
   for j = i+1:100
      w = v - D(j, :);
      S(i,j) = exp(-sqrt(w * w.') / sig);
      S(j,i) = S(i,j);
   end
end
Operating on columns is faster than on rows:
DT = D.';
for i = 1:100
   v = DT(:, i);
   for j = i+1:100
      w = v - DT(:, j);
      S(i,j) = exp(-sqrt(w.' * w) / sig);
      S(j,i) = S(i,j);
   end
end
Please post the timings you get.
4 Commenti
  Jan
      
      
 il 8 Mar 2018
				
      Modificato: Jan
      
      
 il 8 Mar 2018
  
			In pdist you find exactly the same loops as in the suggested code, but S = exp(-Z/sig) does not use the symmetry of the input, such that almost the double number of expensive exp() calls are performed. Therefore I assume, that this "loop free" code is not less "nightmarishly time-consuming". I'm interested in the timings you get, especially for the larger matrices with 10'000 vectors.
I did not draw any conclusions about intentions of anybody. I'm convinced, that the forum should not solve homework. That's all. But discussions about homework are very useful for the forum and the students.
Più risposte (0)
Vedere anche
Categorie
				Scopri di più su Loops and Conditional Statements in Help Center e File Exchange
			
	Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!


