<?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 SVD C example for m &amp;lt; n in Intel® oneAPI Math Kernel Library</title>
    <link>https://community.intel.com/t5/Intel-oneAPI-Math-Kernel-Library/SVD-C-example-for-m-lt-n/m-p/943107#M14657</link>
    <description>Hi,&lt;BR /&gt;&lt;BR /&gt;Does anyone have a SVD example in C when m &amp;lt; n? I am using the code below (it works fine for m &amp;gt;= n), but I get incorrect results for S, U, and V when m &amp;lt; n. I know the section where I am copying p/q back to u/v is incorrect, but p, q, and s are not even correct at that point.&lt;BR /&gt;&lt;BR /&gt;Thanks,&lt;BR /&gt;Marcus&lt;BR /&gt;&lt;BR /&gt;int DLLEXPORT dna_lapack_dsvd( int block_size, int m, int n, double* a, double* s, double* u, double* v ){&lt;BR /&gt;    double* e = new double[n-1];&lt;BR /&gt;    double* tauq = new double[max(1,min(m,n))];&lt;BR /&gt;    double* taup = new double[max(1,min(m,n))];&lt;BR /&gt;    int info;&lt;BR /&gt;    char Q = 'Q';&lt;BR /&gt;    char P = 'P';&lt;BR /&gt;    char U = 'U';&lt;BR /&gt;&lt;BR /&gt;    int lwork = (m + n)*block_size;&lt;BR /&gt;    double* work = new double[lwork];&lt;BR /&gt;    dgebrd(&amp;amp;m, &amp;amp;n, a, &amp;amp;m, s, e, tauq, taup, work, &amp;amp;lwork, &amp;amp;info);&lt;BR /&gt;&lt;BR /&gt;    if( info != 0 ){&lt;BR /&gt;      delete[] work;&lt;BR /&gt;      delete[] e;&lt;BR /&gt;      delete[] taup;&lt;BR /&gt;      delete[] tauq;&lt;BR /&gt;      return info;&lt;BR /&gt;    }&lt;BR /&gt;    &lt;BR /&gt;    int len = m * n;&lt;BR /&gt;    double* q = new double[len];&lt;BR /&gt;    double* p = new double[len];&lt;BR /&gt;    for( int i = 0; i &amp;lt; len; i++ ){&lt;BR /&gt;      q&lt;I&gt; = a&lt;I&gt;;&lt;BR /&gt;      p&lt;I&gt; = a&lt;I&gt;;&lt;BR /&gt;    }&lt;BR /&gt;&lt;BR /&gt;    lwork = min(m,n)*block_size;&lt;BR /&gt;    delete[] work;&lt;BR /&gt;    work = new double[lwork];&lt;BR /&gt;&lt;BR /&gt;    if( m &amp;gt; n ){&lt;BR /&gt;      dorgbr(&amp;amp;Q, &amp;amp;m, &amp;amp;n, &amp;amp;n, q, &amp;amp;m, tauq, work, &amp;amp;lwork, &amp;amp;info);&lt;BR /&gt;    } else{&lt;BR /&gt;      dorgbr(&amp;amp;Q, &amp;amp;m, &amp;amp;m, &amp;amp;n, q, &amp;amp;m, tauq, work, &amp;amp;lwork, &amp;amp;info);&lt;BR /&gt;    }&lt;BR /&gt;&lt;BR /&gt;    if( info != 0 ){&lt;BR /&gt;      delete[] work;&lt;BR /&gt;      delete[] e;&lt;BR /&gt;      delete[] p;&lt;BR /&gt;      delete[] q;&lt;BR /&gt;      delete[] taup;&lt;BR /&gt;      delete[] tauq;&lt;BR /&gt;      return info;&lt;BR /&gt;    }&lt;BR /&gt;&lt;BR /&gt;    if( m &amp;lt; n ){&lt;BR /&gt;      dorgbr(&amp;amp;P, &amp;amp;m, &amp;amp;n, &amp;amp;m, p, &amp;amp;m, taup, work, &amp;amp;lwork, &amp;amp;info);&lt;BR /&gt;    } else{&lt;BR /&gt;      dorgbr(&amp;amp;P, &amp;amp;n, &amp;amp;n, &amp;amp;m, p, &amp;amp;m, taup, work, &amp;amp;lwork, &amp;amp;info);&lt;BR /&gt;    } &lt;BR /&gt;&lt;BR /&gt;    if( info != 0 ){&lt;BR /&gt;      delete[] work;&lt;BR /&gt;      delete[] e;&lt;BR /&gt;      delete[] p;&lt;BR /&gt;      delete[] q;&lt;BR /&gt;      delete[] taup;&lt;BR /&gt;      delete[] tauq;&lt;BR /&gt;      return info;&lt;BR /&gt;    }&lt;BR /&gt;    lwork = max(1,4*(n-1));&lt;BR /&gt;    delete[] work;&lt;BR /&gt;    work = new double[lwork];&lt;BR /&gt;&lt;BR /&gt;    int ncc = 0;&lt;BR /&gt;    int ldc = 1;&lt;BR /&gt;    double* ee = new double&lt;N&gt;;&lt;BR /&gt;    for(int i = 0; i &amp;lt; n; i++ ){&lt;BR /&gt;      ee&lt;I&gt; = e&lt;I&gt;;&lt;BR /&gt;    }&lt;BR /&gt;    delete[] e;&lt;BR /&gt;&lt;BR /&gt;    dbdsqr(&amp;amp;U, &amp;amp;n, &amp;amp;n, &amp;amp;m, &amp;amp;ncc, s, ee, p, &amp;amp;m, q, &amp;amp;m, NULL, &amp;amp;ldc, work, &amp;amp;info);&lt;BR /&gt;    &lt;BR /&gt;    //code is wrong for m &amp;lt; n&lt;BR /&gt;    if( m &amp;lt; n ){&lt;BR /&gt;      for( int i = 0; i &amp;lt; m*m; i++){&lt;BR /&gt;        u&lt;I&gt; = q&lt;I&gt;;&lt;BR /&gt;      }&lt;BR /&gt;      for( int i = 0; i &amp;lt; n*n; i++){&lt;BR /&gt;        v&lt;I&gt; = p&lt;I&gt;;&lt;BR /&gt;      }&lt;BR /&gt;    } else{&lt;BR /&gt;      for( int i = 0; i &amp;lt; m*n; i++){&lt;BR /&gt;        u&lt;I&gt; = q&lt;I&gt;;&lt;BR /&gt;      }&lt;BR /&gt;      for( int i = 0; i &amp;lt; n; i++){&lt;BR /&gt;        for( int j = 0; j &amp;lt; n; j++){&lt;BR /&gt;          v[i*n+j] = p[j*m+i];&lt;BR /&gt;        }&lt;BR /&gt;      }&lt;BR /&gt;    }&lt;BR /&gt;    delete[] work;&lt;BR /&gt;    delete[] ee;&lt;BR /&gt;    delete[] p;&lt;BR /&gt;    delete[] q;&lt;BR /&gt;    delete[] taup;&lt;BR /&gt;    delete[] tauq;&lt;BR /&gt;    return info;&lt;BR /&gt;  }&lt;P&gt;Message Edited by Marcus-Cuda2 on &lt;SPAN class="date_text"&gt;08-23-2004&lt;/SPAN&gt; &lt;SPAN class="time_text"&gt;06:19 AM&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;Message Edited by Marcus-Cuda2 on &lt;SPAN class="date_text"&gt;08-23-2004&lt;/SPAN&gt; &lt;SPAN class="time_text"&gt;06:19 AM&lt;/SPAN&gt;&lt;/P&gt;&lt;/I&gt;&lt;/I&gt;&lt;/I&gt;&lt;/I&gt;&lt;/I&gt;&lt;/I&gt;&lt;/I&gt;&lt;/I&gt;&lt;/N&gt;&lt;/I&gt;&lt;/I&gt;&lt;/I&gt;&lt;/I&gt;</description>
    <pubDate>Mon, 23 Aug 2004 20:18:43 GMT</pubDate>
    <dc:creator>Intel_C_Intel</dc:creator>
    <dc:date>2004-08-23T20:18:43Z</dc:date>
    <item>
      <title>SVD C example for m &lt; n</title>
      <link>https://community.intel.com/t5/Intel-oneAPI-Math-Kernel-Library/SVD-C-example-for-m-lt-n/m-p/943107#M14657</link>
      <description>Hi,&lt;BR /&gt;&lt;BR /&gt;Does anyone have a SVD example in C when m &amp;lt; n? I am using the code below (it works fine for m &amp;gt;= n), but I get incorrect results for S, U, and V when m &amp;lt; n. I know the section where I am copying p/q back to u/v is incorrect, but p, q, and s are not even correct at that point.&lt;BR /&gt;&lt;BR /&gt;Thanks,&lt;BR /&gt;Marcus&lt;BR /&gt;&lt;BR /&gt;int DLLEXPORT dna_lapack_dsvd( int block_size, int m, int n, double* a, double* s, double* u, double* v ){&lt;BR /&gt;    double* e = new double[n-1];&lt;BR /&gt;    double* tauq = new double[max(1,min(m,n))];&lt;BR /&gt;    double* taup = new double[max(1,min(m,n))];&lt;BR /&gt;    int info;&lt;BR /&gt;    char Q = 'Q';&lt;BR /&gt;    char P = 'P';&lt;BR /&gt;    char U = 'U';&lt;BR /&gt;&lt;BR /&gt;    int lwork = (m + n)*block_size;&lt;BR /&gt;    double* work = new double[lwork];&lt;BR /&gt;    dgebrd(&amp;amp;m, &amp;amp;n, a, &amp;amp;m, s, e, tauq, taup, work, &amp;amp;lwork, &amp;amp;info);&lt;BR /&gt;&lt;BR /&gt;    if( info != 0 ){&lt;BR /&gt;      delete[] work;&lt;BR /&gt;      delete[] e;&lt;BR /&gt;      delete[] taup;&lt;BR /&gt;      delete[] tauq;&lt;BR /&gt;      return info;&lt;BR /&gt;    }&lt;BR /&gt;    &lt;BR /&gt;    int len = m * n;&lt;BR /&gt;    double* q = new double[len];&lt;BR /&gt;    double* p = new double[len];&lt;BR /&gt;    for( int i = 0; i &amp;lt; len; i++ ){&lt;BR /&gt;      q&lt;I&gt; = a&lt;I&gt;;&lt;BR /&gt;      p&lt;I&gt; = a&lt;I&gt;;&lt;BR /&gt;    }&lt;BR /&gt;&lt;BR /&gt;    lwork = min(m,n)*block_size;&lt;BR /&gt;    delete[] work;&lt;BR /&gt;    work = new double[lwork];&lt;BR /&gt;&lt;BR /&gt;    if( m &amp;gt; n ){&lt;BR /&gt;      dorgbr(&amp;amp;Q, &amp;amp;m, &amp;amp;n, &amp;amp;n, q, &amp;amp;m, tauq, work, &amp;amp;lwork, &amp;amp;info);&lt;BR /&gt;    } else{&lt;BR /&gt;      dorgbr(&amp;amp;Q, &amp;amp;m, &amp;amp;m, &amp;amp;n, q, &amp;amp;m, tauq, work, &amp;amp;lwork, &amp;amp;info);&lt;BR /&gt;    }&lt;BR /&gt;&lt;BR /&gt;    if( info != 0 ){&lt;BR /&gt;      delete[] work;&lt;BR /&gt;      delete[] e;&lt;BR /&gt;      delete[] p;&lt;BR /&gt;      delete[] q;&lt;BR /&gt;      delete[] taup;&lt;BR /&gt;      delete[] tauq;&lt;BR /&gt;      return info;&lt;BR /&gt;    }&lt;BR /&gt;&lt;BR /&gt;    if( m &amp;lt; n ){&lt;BR /&gt;      dorgbr(&amp;amp;P, &amp;amp;m, &amp;amp;n, &amp;amp;m, p, &amp;amp;m, taup, work, &amp;amp;lwork, &amp;amp;info);&lt;BR /&gt;    } else{&lt;BR /&gt;      dorgbr(&amp;amp;P, &amp;amp;n, &amp;amp;n, &amp;amp;m, p, &amp;amp;m, taup, work, &amp;amp;lwork, &amp;amp;info);&lt;BR /&gt;    } &lt;BR /&gt;&lt;BR /&gt;    if( info != 0 ){&lt;BR /&gt;      delete[] work;&lt;BR /&gt;      delete[] e;&lt;BR /&gt;      delete[] p;&lt;BR /&gt;      delete[] q;&lt;BR /&gt;      delete[] taup;&lt;BR /&gt;      delete[] tauq;&lt;BR /&gt;      return info;&lt;BR /&gt;    }&lt;BR /&gt;    lwork = max(1,4*(n-1));&lt;BR /&gt;    delete[] work;&lt;BR /&gt;    work = new double[lwork];&lt;BR /&gt;&lt;BR /&gt;    int ncc = 0;&lt;BR /&gt;    int ldc = 1;&lt;BR /&gt;    double* ee = new double&lt;N&gt;;&lt;BR /&gt;    for(int i = 0; i &amp;lt; n; i++ ){&lt;BR /&gt;      ee&lt;I&gt; = e&lt;I&gt;;&lt;BR /&gt;    }&lt;BR /&gt;    delete[] e;&lt;BR /&gt;&lt;BR /&gt;    dbdsqr(&amp;amp;U, &amp;amp;n, &amp;amp;n, &amp;amp;m, &amp;amp;ncc, s, ee, p, &amp;amp;m, q, &amp;amp;m, NULL, &amp;amp;ldc, work, &amp;amp;info);&lt;BR /&gt;    &lt;BR /&gt;    //code is wrong for m &amp;lt; n&lt;BR /&gt;    if( m &amp;lt; n ){&lt;BR /&gt;      for( int i = 0; i &amp;lt; m*m; i++){&lt;BR /&gt;        u&lt;I&gt; = q&lt;I&gt;;&lt;BR /&gt;      }&lt;BR /&gt;      for( int i = 0; i &amp;lt; n*n; i++){&lt;BR /&gt;        v&lt;I&gt; = p&lt;I&gt;;&lt;BR /&gt;      }&lt;BR /&gt;    } else{&lt;BR /&gt;      for( int i = 0; i &amp;lt; m*n; i++){&lt;BR /&gt;        u&lt;I&gt; = q&lt;I&gt;;&lt;BR /&gt;      }&lt;BR /&gt;      for( int i = 0; i &amp;lt; n; i++){&lt;BR /&gt;        for( int j = 0; j &amp;lt; n; j++){&lt;BR /&gt;          v[i*n+j] = p[j*m+i];&lt;BR /&gt;        }&lt;BR /&gt;      }&lt;BR /&gt;    }&lt;BR /&gt;    delete[] work;&lt;BR /&gt;    delete[] ee;&lt;BR /&gt;    delete[] p;&lt;BR /&gt;    delete[] q;&lt;BR /&gt;    delete[] taup;&lt;BR /&gt;    delete[] tauq;&lt;BR /&gt;    return info;&lt;BR /&gt;  }&lt;P&gt;Message Edited by Marcus-Cuda2 on &lt;SPAN class="date_text"&gt;08-23-2004&lt;/SPAN&gt; &lt;SPAN class="time_text"&gt;06:19 AM&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;Message Edited by Marcus-Cuda2 on &lt;SPAN class="date_text"&gt;08-23-2004&lt;/SPAN&gt; &lt;SPAN class="time_text"&gt;06:19 AM&lt;/SPAN&gt;&lt;/P&gt;&lt;/I&gt;&lt;/I&gt;&lt;/I&gt;&lt;/I&gt;&lt;/I&gt;&lt;/I&gt;&lt;/I&gt;&lt;/I&gt;&lt;/N&gt;&lt;/I&gt;&lt;/I&gt;&lt;/I&gt;&lt;/I&gt;</description>
      <pubDate>Mon, 23 Aug 2004 20:18:43 GMT</pubDate>
      <guid>https://community.intel.com/t5/Intel-oneAPI-Math-Kernel-Library/SVD-C-example-for-m-lt-n/m-p/943107#M14657</guid>
      <dc:creator>Intel_C_Intel</dc:creator>
      <dc:date>2004-08-23T20:18:43Z</dc:date>
    </item>
  </channel>
</rss>

