<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/135832</link>
    <title>MATLAB Central Newsreader - Vectorizing a nested for loop</title>
    <description>Feed for thread: Vectorizing a nested for loop</description>
    <language>en-us</language>
    <copyright>&amp;copy;1994-2012 by MathWorks, Inc.</copyright>
    <webmaster>webmaster@mathworks.com</webmaster>
    <generator>MATLAB Central Newsreader</generator>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <ttl>60</ttl>
    <image>
      <title>MathWorks</title>
      <url>http://www.mathworks.com/images/membrane_icon.gif</url>
    </image>
    <item>
      <pubDate>Sun, 12 Nov 2006 10:07:52 -0500</pubDate>
      <title>Vectorizing a nested for loop</title>
      <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/135832#342188</link>
      <author>Mike Stachowsky</author>
      <description>Hello all,&lt;br&gt;
&lt;br&gt;
I'm a beginner to matlab and am looking at a code that runs for so&lt;br&gt;
long it won't complete in a reasonable amount of time! Its a nested&lt;br&gt;
for loop shown below:&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;entropy = zeros(8,8);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for k=1:8&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;%now we figure out entropy&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for h = 1:8&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;n=length(find(coords(:,1)&amp;lt;(-100 +(k*200/8)) &amp;&lt;br&gt;
coords(:,1)&amp;gt;(-100 + (k-1)*200/8) &amp; coords(:,2) &amp;lt; (-100 +&lt;br&gt;
(h*200/8)) &amp; coords(:,2)&amp;gt;(-100 + (h-1)*200/8)));&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(n~=0)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;entropy(k,h) = -(n/400)*(log(n/400));&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;entropy(k,h)=0;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end&lt;br&gt;
&lt;br&gt;
now the problem is that i can't figure out how it can be vectorized.&lt;br&gt;
here's what it does:&lt;br&gt;
&lt;br&gt;
It searches an array of coordinates (x,y) of random dots spread about&lt;br&gt;
the screen. it breaks up the entire plane into an 8x8 grid, and&lt;br&gt;
finds how many of those dots are in each grid box.&lt;br&gt;
&lt;br&gt;
The problem is that the dots are moved each time through, so in fact&lt;br&gt;
this nested for loop is itself nested in another for loop that runs&lt;br&gt;
one million times! clearly 8x8 a million times is unnacceptable for&lt;br&gt;
runtime.&lt;br&gt;
&lt;br&gt;
besides the trivial solution of running the 8x8 for loop once every&lt;br&gt;
1000 times rather than each time through the loop, is there a way to&lt;br&gt;
make this code run faster?&lt;br&gt;
&lt;br&gt;
Mike</description>
    </item>
    <item>
      <pubDate>Sun, 12 Nov 2006 08:53:48 -0500</pubDate>
      <title>Re: Vectorizing a nested for loop</title>
      <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/135832#342192</link>
      <author>wegwerp@gmail.com</author>
      <description>Mike Stachowsky wrote:&lt;br&gt;
&amp;gt; Hello all,&lt;br&gt;
&amp;gt;&lt;br&gt;
&amp;gt; I'm a beginner to matlab and am looking at a code that runs for so&lt;br&gt;
&amp;gt; long it won't complete in a reasonable amount of time! Its a nested&lt;br&gt;
&amp;gt; for loop shown below:&lt;br&gt;
&amp;gt;&lt;br&gt;
&amp;gt;       entropy = zeros(8,8);&lt;br&gt;
&amp;gt;             for k=1:8&lt;br&gt;
&amp;gt;             %now we figure out entropy&lt;br&gt;
&amp;gt;                  for h = 1:8&lt;br&gt;
&amp;gt;                      n=length(find(coords(:,1)&amp;lt;(-100 +(k*200/8)) &amp;&lt;br&gt;
&amp;gt; coords(:,1)&amp;gt;(-100 + (k-1)*200/8) &amp; coords(:,2) &amp;lt; (-100 +&lt;br&gt;
&amp;gt; (h*200/8)) &amp; coords(:,2)&amp;gt;(-100 + (h-1)*200/8)));&lt;br&gt;
&amp;gt;                      if(n~=0)&lt;br&gt;
&amp;gt;                      entropy(k,h) = -(n/400)*(log(n/400));&lt;br&gt;
&amp;gt;                      else&lt;br&gt;
&amp;gt;                      entropy(k,h)=0;&lt;br&gt;
&amp;gt;                      end&lt;br&gt;
&amp;gt;                 end&lt;br&gt;
&amp;gt;             end&lt;br&gt;
&amp;gt;&lt;br&gt;
&amp;gt; now the problem is that i can't figure out how it can be vectorized.&lt;br&gt;
&amp;gt; here's what it does:&lt;br&gt;
&amp;gt;&lt;br&gt;
&amp;gt; It searches an array of coordinates (x,y) of random dots spread about&lt;br&gt;
&amp;gt; the screen. it breaks up the entire plane into an 8x8 grid, and&lt;br&gt;
&amp;gt; finds how many of those dots are in each grid box.&lt;br&gt;
&amp;gt;&lt;br&gt;
&amp;gt; The problem is that the dots are moved each time through, so in fact&lt;br&gt;
&amp;gt; this nested for loop is itself nested in another for loop that runs&lt;br&gt;
&amp;gt; one million times! clearly 8x8 a million times is unnacceptable for&lt;br&gt;
&amp;gt; runtime.&lt;br&gt;
&amp;gt;&lt;br&gt;
&amp;gt; besides the trivial solution of running the 8x8 for loop once every&lt;br&gt;
&amp;gt; 1000 times rather than each time through the loop, is there a way to&lt;br&gt;
&amp;gt; make this code run faster?&lt;br&gt;
&amp;gt;&lt;br&gt;
&amp;gt; Mike&lt;br&gt;
&lt;br&gt;
My idea is to first calculate for every datapoint in which box it falls&lt;br&gt;
and then do some sort of histogram function. My hack would be to not&lt;br&gt;
use 2d coordinates, but with a 0..63 number, and reshaping to a matrix&lt;br&gt;
later.&lt;br&gt;
&lt;br&gt;
Untested (only have matlab at work), so check the details yourself:&lt;br&gt;
&lt;br&gt;
%assuming that coords are guaranteed to fall within boxes&lt;br&gt;
nbox = 8;&lt;br&gt;
boxwidth = 200/nbox;&lt;br&gt;
&lt;br&gt;
%calculate boxnum for each coord = x+nbox*y = 0..63&lt;br&gt;
boxnum = fix((coords(:,1)+100) /boxwidth) + nbox*fix((coords(:,2)+100)&lt;br&gt;
/boxwidth);&lt;br&gt;
N = hist(boxnum, 0:63); % or something with histc&lt;br&gt;
entropy = -(N/400)*(log(N/400));&lt;br&gt;
entropy(isnan(entropy)) = 0; %fix up bad points&lt;br&gt;
entropy = reshape(entropy,nbox,nbox); %reshape to square&lt;br&gt;
&lt;br&gt;
HTH,&lt;br&gt;
Bas</description>
    </item>
  </channel>
</rss>

