<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/272393</link>
    <title>MATLAB Central Newsreader - Need to make code more Efficient</title>
    <description>Feed for thread: Need to make code more Efficient</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>Tue, 09 Feb 2010 10:36:04 -0500</pubDate>
      <title>Need to make code more Efficient</title>
      <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/272393#715274</link>
      <author>Fraser Dickson</author>
      <description>Hi i have a piece of code that looks through a data set and works out the average value for each cell based on the values sourrounding that cell ( 10 cells above and 10 cells below averaged).  The data set is extremely large ( roughly 500 x 40)  so i was wondering if anyone could reccomend how i can speed up my code.  I have a lot of for loops and im sure there is nothing efficient about that !&lt;br&gt;
&lt;br&gt;
Thanks&lt;br&gt;
&lt;br&gt;
average = zeros(500,40);&lt;br&gt;
&amp;nbsp;r1 = zeros(kd,1);&lt;br&gt;
&amp;nbsp;r2 = zeros(kd,1);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;for x = 1:40&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for y = 1 : 500&lt;br&gt;
&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;d_under_test = x+kd+cd;&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;r_under_test = y +kr+cr;&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&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 counter = 1:kd&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;r1(counter) = temp_array((d_under_test + cd  +counter ),(r_under_test));&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;
&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 counter = 1:kd&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;r2(counter) = temp_array((d_under_test - cd  -counter ),(r_under_test));&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;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;r2mean = mean(r2);&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;r1mean = mean(r1);&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;average(x,y) = 0.5*(r1mean+r2mean);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end</description>
    </item>
    <item>
      <pubDate>Tue, 09 Feb 2010 12:49:02 -0500</pubDate>
      <title>Re: Need to make code more Efficient</title>
      <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/272393#715313</link>
      <author>Oleg Komarov</author>
      <description>&quot;Fraser Dickson&quot; &lt;br&gt;
&amp;gt; Hi i have a piece of code that looks through a data set and works out the average value for each cell based on the values sourrounding that cell ( 10 cells above and 10 cells below averaged).  The data set is extremely large ( roughly 500 x 40)  so i was wondering if anyone could reccomend how i can speed up my code.  I have a lot of for loops and im sure there is nothing efficient about that !&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; Thanks&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; average = zeros(500,40);&lt;br&gt;
&amp;gt;  r1 = zeros(kd,1);&lt;br&gt;
&amp;gt;  r2 = zeros(kd,1);&lt;br&gt;
&amp;gt;    &lt;br&gt;
&amp;gt;  for x = 1:40&lt;br&gt;
&amp;gt;         for y = 1 : 500&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt;             d_under_test = x+kd+cd;&lt;br&gt;
&amp;gt;             r_under_test = y +kr+cr;&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt;             for counter = 1:kd&lt;br&gt;
&amp;gt;                 r1(counter) = temp_array((d_under_test + cd  +counter ),(r_under_test));&lt;br&gt;
&amp;gt;             end&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt;             for counter = 1:kd&lt;br&gt;
&amp;gt;                 r2(counter) = temp_array((d_under_test - cd  -counter ),(r_under_test));&lt;br&gt;
&amp;gt;             end&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt;             r2mean = mean(r2);&lt;br&gt;
&amp;gt;             r1mean = mean(r1);&lt;br&gt;
&amp;gt;             average(x,y) = 0.5*(r1mean+r2mean);&lt;br&gt;
&amp;gt;      end&lt;br&gt;
&amp;gt;     end&lt;br&gt;
&lt;br&gt;
&quot;The data set is extremely large ( roughly 500 x 40) .&quot;&lt;br&gt;
Huge is when you have a 100e6 by 20 matrix... &lt;br&gt;
&lt;br&gt;
Plz post the result of:&lt;br&gt;
whos kd &lt;br&gt;
whos cd&lt;br&gt;
&lt;br&gt;
You should definitely forget your approach. Read this useful doc:&lt;br&gt;
&lt;a href=&quot;http://www.mathworks.com/support/tech-notes/1100/1109.html&quot;&gt;http://www.mathworks.com/support/tech-notes/1100/1109.html&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
Oleg</description>
    </item>
    <item>
      <pubDate>Tue, 09 Feb 2010 13:08:02 -0500</pubDate>
      <title>Re: Need to make code more Efficient</title>
      <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/272393#715319</link>
      <author>Fraser Dickson</author>
      <description>Hi &lt;br&gt;
&lt;br&gt;
cd = 2&lt;br&gt;
&amp;nbsp;&amp;nbsp;kd = 16&lt;br&gt;
&lt;br&gt;
Basically the code looks at 16 values  either side of the cell under test and returns the average ( ignoring the 2 cells ( kd)  imeediate to the cell) so that will be (500*40) of doing this averaging routine&lt;br&gt;
&lt;br&gt;
the code is taking at least 15 seconds to run through which is way to long i need to speed it up.  I thought i was using vectorized loops could you explain what i am doing wrong?&lt;br&gt;
&lt;br&gt;
Thanks</description>
    </item>
    <item>
      <pubDate>Tue, 09 Feb 2010 15:42:36 -0500</pubDate>
      <title>Re: Need to make code more Efficient</title>
      <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/272393#715370</link>
      <author>Walter Roberson</author>
      <description>Fraser Dickson wrote:&lt;br&gt;
&amp;gt; Hi i have a piece of code that looks through a data set and works out &lt;br&gt;
&amp;gt; the average value for each cell based on the values sourrounding that &lt;br&gt;
&amp;gt; cell ( 10 cells above and 10 cells below averaged).&lt;br&gt;
&lt;br&gt;
Sounds like a job for blkproc()</description>
    </item>
    <item>
      <pubDate>Tue, 09 Feb 2010 15:52:04 -0500</pubDate>
      <title>Re: Need to make code more Efficient</title>
      <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/272393#715377</link>
      <author>Oleg Komarov</author>
      <description>&amp;gt; I thought i was using vectorized loops could you explain what i am doing wrong?&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; Thanks&lt;br&gt;
Have you given a look at the link I posted?&lt;br&gt;
&lt;br&gt;
Vectorized ~= Loop in matlab approach.&lt;br&gt;
&lt;br&gt;
Oleg</description>
    </item>
    <item>
      <pubDate>Tue, 09 Feb 2010 20:12:18 -0500</pubDate>
      <title>Re: Need to make code more Efficient</title>
      <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/272393#715485</link>
      <author>Fraser Dickson</author>
      <description>I dont realy understand how i could do what i need to do without using a loop???&lt;br&gt;
&lt;br&gt;
Ive never heard of this blcproc() func before i shall look into that </description>
    </item>
    <item>
      <pubDate>Tue, 09 Feb 2010 22:29:27 -0500</pubDate>
      <title>Re: Need to make code more Efficient</title>
      <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/272393#715527</link>
      <author>Walter Roberson</author>
      <description>Fraser Dickson wrote:&lt;br&gt;
&lt;br&gt;
&amp;gt;            for counter = 1:kd&lt;br&gt;
&amp;gt;                r1(counter) = temp_array((d_under_test + cd  +counter &lt;br&gt;
&amp;gt; ),(r_under_test));&lt;br&gt;
&amp;gt;            end&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt;            for counter = 1:kd&lt;br&gt;
&amp;gt;                r2(counter) = temp_array((d_under_test - cd  -counter &lt;br&gt;
&amp;gt; ),(r_under_test));&lt;br&gt;
&amp;gt;            end&lt;br&gt;
&lt;br&gt;
r2_r1 = temp_array(d_under_test - cd - kd : ...&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;d_under_test + cd + kd, ...&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;r_under_test);&lt;br&gt;
r2mean = mean(r2_r1(1:kd));&lt;br&gt;
r1mean = mean(r2_rw(end-kd-1:end));&lt;br&gt;
average(x,y) = (r1mean + r2mean) / 2;&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
Note: because kr and cr do not vary according to y, you can vectorize to do an &lt;br&gt;
entire column at one time.&lt;br&gt;
&lt;br&gt;
Also note that you could move the initialization of d_under_test to outside of &lt;br&gt;
the 'for y' loop.&lt;br&gt;
&lt;br&gt;
&amp;gt;            r2mean = mean(r2);&lt;br&gt;
&amp;gt;            r1mean = mean(r1);&lt;br&gt;
&amp;gt;            average(x,y) = 0.5*(r1mean+r2mean);&lt;br&gt;
&amp;gt;     end&lt;br&gt;
&amp;gt;    end</description>
    </item>
  </channel>
</rss>

