<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/252151</link>
    <title>MATLAB Central Newsreader - Vectorizing nested for loops</title>
    <description>Feed for thread: Vectorizing nested for loops</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>Mon, 25 May 2009 16:46:01 -0400</pubDate>
      <title>Vectorizing nested for loops</title>
      <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/252151#652280</link>
      <author>Farhan Rahman</author>
      <description>Hi everyone,&lt;br&gt;
&lt;br&gt;
I'm trying to vectorize a series of nested for loops within a larger script in order to optimize the performance of it. This seems like it should be fairly simple, but after a lot of messing about with it I haven't managed to make much headway. &lt;br&gt;
&lt;br&gt;
Here's a section of my code that I'm having trouble with:&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for i=2:nhx-1&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for j=2:nhy-1&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;Unew(i,j)= U(i,j)-dt*(P(i+1,j)-P(i-1,j))/(2*hx)...&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;+nu*dt*(1/(hx*hx)*(U(i+1,j)-2.*U(i,j)+U(i-1,j))...&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;+1/(hy*hy)*(U(i,j+1)-2.*U(i,j)+U(i,j-1)))...&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;-dt*U(i,j)/(hx)*(U(i,j)-U(i-1,j))...&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;-dt*V(i,j)/(2*hy)*(U(i,j+1)-U(i,j-1));&lt;br&gt;
&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;end&lt;br&gt;
&lt;br&gt;
nhx and nhy are predefined vectors, and U, Unew and P are preallocated matrices of zeros. dt, hx and hy are all static single values.&lt;br&gt;
&lt;br&gt;
Hopefully someone can help,&lt;br&gt;
&lt;br&gt;
Cheers :)</description>
    </item>
    <item>
      <pubDate>Mon, 25 May 2009 17:30:05 -0400</pubDate>
      <title>Re: Vectorizing nested for loops</title>
      <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/252151#652284</link>
      <author>Matt </author>
      <description>&quot;Farhan Rahman&quot; &amp;lt;farban@gmail.com&amp;gt; wrote in message &amp;lt;gvei09$3hm$1@fred.mathworks.com&amp;gt;...&lt;br&gt;
&amp;gt; Hi everyone,&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; I'm trying to vectorize a series of nested for loops within a larger script in order to optimize the performance of it. This seems like it should be fairly simple, but after a lot of messing about with it I haven't managed to make much headway. &lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; Here's a section of my code that I'm having trouble with:&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt;     for i=2:nhx-1&lt;br&gt;
&amp;gt;         for j=2:nhy-1&lt;br&gt;
&amp;gt;            Unew(i,j)= U(i,j)-dt*(P(i+1,j)-P(i-1,j))/(2*hx)...&lt;br&gt;
&amp;gt;            +nu*dt*(1/(hx*hx)*(U(i+1,j)-2.*U(i,j)+U(i-1,j))...&lt;br&gt;
&amp;gt;            +1/(hy*hy)*(U(i,j+1)-2.*U(i,j)+U(i,j-1)))...&lt;br&gt;
&amp;gt;            -dt*U(i,j)/(hx)*(U(i,j)-U(i-1,j))...&lt;br&gt;
&amp;gt;            -dt*V(i,j)/(2*hy)*(U(i,j+1)-U(i,j-1));&lt;br&gt;
&amp;gt;         end&lt;br&gt;
&amp;gt;     end&lt;br&gt;
&amp;gt; &lt;br&gt;
&lt;br&gt;
&lt;br&gt;
help ndgrid&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&amp;gt; nhx and nhy are predefined vectors, and U, Unew and P are preallocated matrices of zeros. dt, hx and hy are all static single values.&lt;br&gt;
&lt;br&gt;
and V? If V is zero like U  and P, it looks like Unew should evaluate to zero as well.&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; Cheers :)</description>
    </item>
    <item>
      <pubDate>Mon, 25 May 2009 18:01:44 -0400</pubDate>
      <title>Re: Vectorizing nested for loops</title>
      <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/252151#652290</link>
      <author>Bruno Luong</author>
      <description>&quot;Farhan Rahman&quot; &amp;lt;farban@gmail.com&amp;gt; wrote in message &amp;lt;gvei09$3hm$1@fred.mathworks.com&amp;gt;...&lt;br&gt;
&amp;gt; Hi everyone,&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; I'm trying to vectorize a series of nested for loops within a larger script in order to optimize the performance of it. This seems like it should be fairly simple, but after a lot of messing about with it I haven't managed to make much headway. &lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; Here's a section of my code that I'm having trouble with:&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt;     for i=2:nhx-1&lt;br&gt;
&amp;gt;         for j=2:nhy-1&lt;br&gt;
&amp;gt;            Unew(i,j)= U(i,j)-dt*(P(i+1,j)-P(i-1,j))/(2*hx)...&lt;br&gt;
&amp;gt;            +nu*dt*(1/(hx*hx)*(U(i+1,j)-2.*U(i,j)+U(i-1,j))...&lt;br&gt;
&amp;gt;            +1/(hy*hy)*(U(i,j+1)-2.*U(i,j)+U(i,j-1)))...&lt;br&gt;
&amp;gt;            -dt*U(i,j)/(hx)*(U(i,j)-U(i-1,j))...&lt;br&gt;
&amp;gt;            -dt*V(i,j)/(2*hy)*(U(i,j+1)-U(i,j-1));&lt;br&gt;
&amp;gt;         end&lt;br&gt;
&amp;gt;     end&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; nhx and nhy are predefined vectors, and U, Unew and P are preallocated matrices of zeros. dt, hx and hy are all static single values.&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; Hopefully someone can help,&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; Cheers :)&lt;br&gt;
&lt;br&gt;
If you have recent MATLAB that support bsxfun (from 2007A IIRC), You can use bsxops to remove the loop!&lt;br&gt;
&lt;br&gt;
&lt;a href=&quot;http://www.mathworks.com/matlabcentral/fileexchange/23821&quot;&gt;http://www.mathworks.com/matlabcentral/fileexchange/23821&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
bsxops(1);&lt;br&gt;
&lt;br&gt;
i = 2:nhx-1;&lt;br&gt;
j = 2:nhy-1;&lt;br&gt;
&lt;br&gt;
Unew(i,j)= U(i,j)-dt*(P(i+1,j)-P(i-1,j))/(2*hx)...&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;+nu*dt*(1/(hx*hx)*(U(i+1,j)-2.*U(i,j)+U(i-1,j))...&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;+1/(hy*hy)*(U(i,j+1)-2.*U(i,j)+U(i,j-1)))...&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-dt*U(i,j)./(hx).*(U(i,j)-U(i-1,j))...&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-dt*V(i,j)./(2*hy).*(U(i,j+1)-U(i,j-1));&lt;br&gt;
&lt;br&gt;
bsxops(0);&lt;br&gt;
&lt;br&gt;
% Bruno</description>
    </item>
    <item>
      <pubDate>Mon, 25 May 2009 18:06:02 -0400</pubDate>
      <title>Re: Vectorizing nested for loops</title>
      <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/252151#652291</link>
      <author>Bruno Luong</author>
      <description>Sorry, actually you do not need bsxops, just do this:&lt;br&gt;
&lt;br&gt;
&amp;gt; i = 2:nhx-1;&lt;br&gt;
&amp;gt; j = 2:nhy-1;&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; Unew(i,j)= U(i,j)-dt*(P(i+1,j)-P(i-1,j))/(2*hx)...&lt;br&gt;
&amp;gt;     +nu*dt*(1/(hx*hx)*(U(i+1,j)-2.*U(i,j)+U(i-1,j))...&lt;br&gt;
&amp;gt;     +1/(hy*hy)*(U(i,j+1)-2.*U(i,j)+U(i,j-1)))...&lt;br&gt;
&amp;gt;     -dt*U(i,j)./(hx).*(U(i,j)-U(i-1,j))...&lt;br&gt;
&amp;gt;     -dt*V(i,j)./(2*hy).*(U(i,j+1)-U(i,j-1));&lt;br&gt;
&amp;gt; </description>
    </item>
    <item>
      <pubDate>Tue, 26 May 2009 00:56:02 -0400</pubDate>
      <title>Re: Vectorizing nested for loops</title>
      <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/252151#652325</link>
      <author>Farhan Rahman</author>
      <description>&quot;Bruno Luong&quot; &amp;lt;b.luong@fogale.findmycountry&amp;gt; wrote in message &amp;lt;gvemma$s97$1@fred.mathworks.com&amp;gt;...&lt;br&gt;
&amp;gt; Sorry, actually you do not need bsxops, just do this:&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; &amp;gt; i = 2:nhx-1;&lt;br&gt;
&amp;gt; &amp;gt; j = 2:nhy-1;&lt;br&gt;
&amp;gt; &amp;gt; &lt;br&gt;
&amp;gt; &amp;gt; Unew(i,j)= U(i,j)-dt*(P(i+1,j)-P(i-1,j))/(2*hx)...&lt;br&gt;
&amp;gt; &amp;gt;     +nu*dt*(1/(hx*hx)*(U(i+1,j)-2.*U(i,j)+U(i-1,j))...&lt;br&gt;
&amp;gt; &amp;gt;     +1/(hy*hy)*(U(i,j+1)-2.*U(i,j)+U(i,j-1)))...&lt;br&gt;
&amp;gt; &amp;gt;     -dt*U(i,j)./(hx).*(U(i,j)-U(i-1,j))...&lt;br&gt;
&amp;gt; &amp;gt;     -dt*V(i,j)./(2*hy).*(U(i,j+1)-U(i,j-1));&lt;br&gt;
&amp;gt; &amp;gt; &lt;br&gt;
&lt;br&gt;
Thank you so much, that was much simpler than I was trying to make it and it worked like a charm :)&lt;br&gt;
&lt;br&gt;
Along similar lines then, would it be possible at all to do something similar with a loop in which there were two matrices reliant on the results of each other for each step of the loop? Specifically, this code:&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for i=2:nhx-1&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 j=2:nhy-1&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;resid(i,j)= -1/(hx*hx)*(Pc(i+1,j)-2.*Pc(i,j)+Pc(i-1,j))...&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;-1/(hy*hy)*(Pc(i,j+1)-2.*Pc(i,j)+Pc(i,j-1))...&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;+1/dt*div(i,j);&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;Pc(i,j)= (1/(-2/(hx*hx)-2/(hy*hy))*resid(i,j))*relax_pc+Pc(i,j);&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;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end&lt;br&gt;
&lt;br&gt;
I can't seem to separate the loops without getting incorrect answers, which leaves me in a bit of a pickle with regards to vectorization. I think I can eliminate one of these loops but I'm not sure that the performance gain from that alone is worth the change.&lt;br&gt;
&lt;br&gt;
Thanks again :)</description>
    </item>
    <item>
      <pubDate>Tue, 26 May 2009 02:22:01 -0400</pubDate>
      <title>Re: Vectorizing nested for loops</title>
      <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/252151#652329</link>
      <author>Bruno Luong</author>
      <description>&quot;Farhan Rahman&quot; &amp;lt;farban@gmail.com&amp;gt; wrote in message &amp;lt;gvfen2$239$1@fred.mathworks.com&amp;gt;...&lt;br&gt;
&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt;         for i=2:nhx-1&lt;br&gt;
&amp;gt;             for j=2:nhy-1&lt;br&gt;
&amp;gt;                 resid(i,j)= -1/(hx*hx)*(Pc(i+1,j)-2.*Pc(i,j)+Pc(i-1,j))...&lt;br&gt;
&amp;gt;                 -1/(hy*hy)*(Pc(i,j+1)-2.*Pc(i,j)+Pc(i,j-1))...&lt;br&gt;
&amp;gt;                 +1/dt*div(i,j);&lt;br&gt;
&amp;gt;                 Pc(i,j)= (1/(-2/(hx*hx)-2/(hy*hy))*resid(i,j))*relax_pc+Pc(i,j);&lt;br&gt;
&amp;gt;             end&lt;br&gt;
&amp;gt;         end&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; I can't seem to separate the loops without getting incorrect answers, which leaves me in a bit of a pickle with regards to vectorization. I think I can eliminate one of these loops but I'm not sure that the performance gain from that alone is worth the change.&lt;br&gt;
&amp;gt; &lt;br&gt;
&lt;br&gt;
It looks a lot like a SOA relaxation to solve a finite difference PDE. No this cannot be vectorized from the best of my knowledge.&lt;br&gt;
&lt;br&gt;
Bruno</description>
    </item>
  </channel>
</rss>

