<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Suggestions on how to speed up the following proc IML program - vectorizing? in SAS/IML Software and Matrix Computations</title>
    <link>https://communities.sas.com/t5/SAS-IML-Software-and-Matrix/Suggestions-on-how-to-speed-up-the-following-proc-IML-program/m-p/948262#M6324</link>
    <description>&lt;P&gt;Hi,&lt;/P&gt;
&lt;P&gt;I am struggling with how to speed up the following program. I have been trying to vectorize things, however, cannot get things to work.&amp;nbsp;In the example below I have a 5x5 matrix, however, in practice the matrix is much larger, e.g., 5000 x 5000. Thanks so much for any help or suggestions.&lt;/P&gt;
&lt;P&gt;-Michael&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV&gt;proc IML;&lt;/DIV&gt;
&lt;DIV&gt;nP=5;&lt;/DIV&gt;
&lt;DIV&gt;CM= {0 0.5 0.75 0 0.75 , 1 0 1 0 0.5 , 0.375 0.25 0 0.375 0.25 , 0 0 1 0 0, 1 0.333 0.667 0 0 };&lt;/DIV&gt;
&lt;DIV&gt;print CM;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;D = j(nP,nP,0);&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp; do i1 = 1 to nP;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp; &amp;nbsp; do i2 = i1+1 to nP; /* I only need to do the calculation on one half of the CM matrix as the resulting D matrix is symmetric */&lt;/DIV&gt;
&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; do k=1 to nP;&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if k ^= i1 &amp;amp;&amp;amp; k ^= i2 then do; /* I don't use the cases when i1=i2 or i2=i1 */&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; D[i1,i2] = D[i1,i2] + (CM[i1,k] - CM[i2,k])**2 + (CM[k,i1] - CM[k,i2])**2;&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; end;&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; end;&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;D[i1,i2] = sqrt(D[i1,i2]);&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;D[i2,i1] = D[i1,i2];&amp;nbsp;&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; end;&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;end;&lt;/DIV&gt;
&lt;DIV&gt;print D;&lt;/DIV&gt;
&lt;DIV&gt;end;&lt;/DIV&gt;
&lt;DIV&gt;quit;&lt;/DIV&gt;
&lt;DIV&gt;run;&lt;/DIV&gt;</description>
    <pubDate>Sun, 20 Oct 2024 00:10:10 GMT</pubDate>
    <dc:creator>Kona</dc:creator>
    <dc:date>2024-10-20T00:10:10Z</dc:date>
    <item>
      <title>Suggestions on how to speed up the following proc IML program - vectorizing?</title>
      <link>https://communities.sas.com/t5/SAS-IML-Software-and-Matrix/Suggestions-on-how-to-speed-up-the-following-proc-IML-program/m-p/948262#M6324</link>
      <description>&lt;P&gt;Hi,&lt;/P&gt;
&lt;P&gt;I am struggling with how to speed up the following program. I have been trying to vectorize things, however, cannot get things to work.&amp;nbsp;In the example below I have a 5x5 matrix, however, in practice the matrix is much larger, e.g., 5000 x 5000. Thanks so much for any help or suggestions.&lt;/P&gt;
&lt;P&gt;-Michael&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV&gt;proc IML;&lt;/DIV&gt;
&lt;DIV&gt;nP=5;&lt;/DIV&gt;
&lt;DIV&gt;CM= {0 0.5 0.75 0 0.75 , 1 0 1 0 0.5 , 0.375 0.25 0 0.375 0.25 , 0 0 1 0 0, 1 0.333 0.667 0 0 };&lt;/DIV&gt;
&lt;DIV&gt;print CM;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;D = j(nP,nP,0);&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp; do i1 = 1 to nP;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp; &amp;nbsp; do i2 = i1+1 to nP; /* I only need to do the calculation on one half of the CM matrix as the resulting D matrix is symmetric */&lt;/DIV&gt;
&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; do k=1 to nP;&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if k ^= i1 &amp;amp;&amp;amp; k ^= i2 then do; /* I don't use the cases when i1=i2 or i2=i1 */&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; D[i1,i2] = D[i1,i2] + (CM[i1,k] - CM[i2,k])**2 + (CM[k,i1] - CM[k,i2])**2;&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; end;&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; end;&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;D[i1,i2] = sqrt(D[i1,i2]);&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;D[i2,i1] = D[i1,i2];&amp;nbsp;&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; end;&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;end;&lt;/DIV&gt;
&lt;DIV&gt;print D;&lt;/DIV&gt;
&lt;DIV&gt;end;&lt;/DIV&gt;
&lt;DIV&gt;quit;&lt;/DIV&gt;
&lt;DIV&gt;run;&lt;/DIV&gt;</description>
      <pubDate>Sun, 20 Oct 2024 00:10:10 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-IML-Software-and-Matrix/Suggestions-on-how-to-speed-up-the-following-proc-IML-program/m-p/948262#M6324</guid>
      <dc:creator>Kona</dc:creator>
      <dc:date>2024-10-20T00:10:10Z</dc:date>
    </item>
    <item>
      <title>Re: Suggestions on how to speed up the following proc IML program - vectorizing?</title>
      <link>https://communities.sas.com/t5/SAS-IML-Software-and-Matrix/Suggestions-on-how-to-speed-up-the-following-proc-IML-program/m-p/948267#M6325</link>
      <description>&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;
proc IML;
nP=5;
CM= {0 0.5 0.75 0 0.75 , 1 0 1 0 0.5 , 0.375 0.25 0 0.375 0.25 , 0 0 1 0 0, 1 0.333 0.667 0 0 };
print CM;
 
D = j(nP,nP,0);
  do i1 = 1 to nP;
    do i2 = i1+1 to nP; 
	  temp=(CM[i1,]-CM[i2,])##2 + t((CM[,i1]-CM[,i2])##2);
	  temp[i1||i2]=0;/* I don't use the cases when i1=i2 or i2=i1 */
      D[i1,i2] = sqrt(cusum(temp)[nP]);
  end;
 end;
D=D`+D;
print D;
quit;

&lt;/CODE&gt;&lt;/PRE&gt;</description>
      <pubDate>Tue, 22 Oct 2024 03:24:28 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-IML-Software-and-Matrix/Suggestions-on-how-to-speed-up-the-following-proc-IML-program/m-p/948267#M6325</guid>
      <dc:creator>Ksharp</dc:creator>
      <dc:date>2024-10-22T03:24:28Z</dc:date>
    </item>
    <item>
      <title>Re: Suggestions on how to speed up the following proc IML program - vectorizing?</title>
      <link>https://communities.sas.com/t5/SAS-IML-Software-and-Matrix/Suggestions-on-how-to-speed-up-the-following-proc-IML-program/m-p/948284#M6326</link>
      <description>&lt;P&gt;Many thanks Ksharp. That was exactly what I was looking for.&lt;/P&gt;</description>
      <pubDate>Sun, 20 Oct 2024 14:21:15 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-IML-Software-and-Matrix/Suggestions-on-how-to-speed-up-the-following-proc-IML-program/m-p/948284#M6326</guid>
      <dc:creator>Kona</dc:creator>
      <dc:date>2024-10-20T14:21:15Z</dc:date>
    </item>
  </channel>
</rss>

