<?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 Another point is about the in Intel® oneAPI Math Kernel Library</title>
    <link>https://community.intel.com/t5/Intel-oneAPI-Math-Kernel-Library/About-MKL-bidiagonal-decomposition/m-p/1150159#M27059</link>
    <description>&lt;P&gt;Another point is about the result of bidiagonal matrix B. The result of factorization would not be the only. For example, 1 can be factorized as 1*1, also can be -1*-1, it is depends on the algorithm of factorization. If you get the result with different sign, that means the elements in Q or P&lt;SUP&gt;H&lt;/SUP&gt; maybe also different. It would be fine the results only with different sign. You could use ?ungbr to generate Q and P to check.&amp;nbsp;&lt;/P&gt;</description>
    <pubDate>Fri, 21 Jul 2017 03:41:27 GMT</pubDate>
    <dc:creator>Zhen_Z_Intel</dc:creator>
    <dc:date>2017-07-21T03:41:27Z</dc:date>
    <item>
      <title>About MKL bidiagonal decomposition</title>
      <link>https://community.intel.com/t5/Intel-oneAPI-Math-Kernel-Library/About-MKL-bidiagonal-decomposition/m-p/1150154#M27054</link>
      <description>&lt;P&gt;Dear support team,&lt;/P&gt;

&lt;P&gt;I met some problem&amp;nbsp;when&amp;nbsp;trying to&amp;nbsp;run the ?unmbr() function from MKL, the bidiagonal terms could&amp;nbsp;be calculated correctly, but I was unable to mutiply them back. Could you help me with it?&amp;nbsp;&lt;/P&gt;

&lt;P&gt;Thanks a lot!&lt;/P&gt;

&lt;PRE class="brush:cpp;"&gt;float x_real[6 * 4] = { -0.57, -1.28, -0.39,&amp;nbsp; 0.25, 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-1.93,&amp;nbsp; 1.08, -0.31, -2.14,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2.30,&amp;nbsp; 0.24,&amp;nbsp; 0.40, -0.35,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1.93,&amp;nbsp; 0.64, -0.66,&amp;nbsp; 0.08,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0.15,&amp;nbsp; 0.30,&amp;nbsp; 0.15, -2.13,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0.02,&amp;nbsp; 1.03, -1.43,&amp;nbsp; 0.50};

int length[2] = { 4, 6 };

P = (MKL_Complex8*)MKL_malloc(sizeof(MKL_Complex8)*6*6, 32;&amp;nbsp;
Q = (MKL_Complex8*)MKL_malloc(sizeof(MKL_Complex8)*6*6, 32);
TP = (MKL_Complex8*)MKL_malloc(sizeof(MKL_Complex8*6, 32);
TQ = (MKL_Complex8*)MKL_malloc(sizeof(MKL_Complex8*6, 32);

for (int j = 0; j &amp;lt; length[0] * length[1]; j++)
{
&amp;nbsp;Spec&lt;J&gt;.real = x_real&lt;J&gt;;
&amp;nbsp;Spec&lt;J&gt;.imag = 0;
}&amp;nbsp;

LAPACKE_cgebrd(LAPACK_ROW_MAJOR, length[1], length[0], Spec, length[0], s1, s2, TP, TQ); //here is correct

for (j = 0; j &amp;lt; length[1] * length[0] - 1; j++)
{
&amp;nbsp;&amp;nbsp;P&lt;J&gt;.real = Spec&lt;J&gt;.real;
&amp;nbsp;&amp;nbsp;P&lt;J&gt;.imag = Spec&lt;J&gt;.imag;
&amp;nbsp;&amp;nbsp;Q&lt;J&gt;.real = Spec&lt;J&gt;.real;
&amp;nbsp;&amp;nbsp;Q&lt;J&gt;.imag = Spec&lt;J&gt;.imag;

}


LAPACKE_cunmbr(LAPACK_ROW_MAJOR, 'Q', 'L', 'N', length[1], length[0], length[0], Q, length[0], TQ, S, length[1]);


LAPACKE_cunmbr(LAPACK_ROW_MAJOR, 'P', 'R', 'C', length[1], length[0], length[1], P, length[0], TP, S, length[1]);&lt;/J&gt;&lt;/J&gt;&lt;/J&gt;&lt;/J&gt;&lt;/J&gt;&lt;/J&gt;&lt;/J&gt;&lt;/J&gt;&lt;/J&gt;&lt;/J&gt;&lt;/J&gt;&lt;/PRE&gt;

&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Tue, 18 Jul 2017 17:24:12 GMT</pubDate>
      <guid>https://community.intel.com/t5/Intel-oneAPI-Math-Kernel-Library/About-MKL-bidiagonal-decomposition/m-p/1150154#M27054</guid>
      <dc:creator>Zhonghan_L_</dc:creator>
      <dc:date>2017-07-18T17:24:12Z</dc:date>
    </item>
    <item>
      <title>When I use</title>
      <link>https://community.intel.com/t5/Intel-oneAPI-Math-Kernel-Library/About-MKL-bidiagonal-decomposition/m-p/1150155#M27055</link>
      <description>&lt;P&gt;When I use&lt;/P&gt;

&lt;P&gt;( 0.96,-0.81) (-0.03, 0.96) (-0.91, 2.06) (-0.05, 0.41)&lt;BR /&gt;
	(-0.98, 1.98) (-1.20, 0.19) (-0.66, 0.42) (-0.81, 0.56)&lt;BR /&gt;
	( 0.62,-0.46) ( 1.01, 0.02) ( 0.63,-0.17) (-1.11, 0.60)&lt;BR /&gt;
	(-0.37, 0.38) ( 0.19,-0.54) (-0.98,-0.36) ( 0.22,-0.20)&lt;BR /&gt;
	( 0.83, 0.51) ( 0.20, 0.01) (-0.17,-0.46) ( 1.47, 1.59)&lt;BR /&gt;
	( 1.08,-0.28) ( 0.20,-0.12) (-0.07, 1.23) ( 0.26, 0.26)&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&lt;/P&gt;

&lt;P&gt;as input, the output bidiagonal matrix&lt;/P&gt;

&lt;P&gt;-3.08701&amp;nbsp;&amp;nbsp; 2.11257&amp;nbsp;&amp;nbsp; 0&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;0&lt;BR /&gt;
	0&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;2.06604&amp;nbsp;&amp;nbsp; 1.26281&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;0&lt;BR /&gt;
	0&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;0&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.87313&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -1.61263&lt;BR /&gt;
	0&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;0&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; 0&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; 2.00218&lt;/P&gt;

&lt;P&gt;is also incorrect, the correct output should be&lt;/P&gt;

&lt;P&gt;Diagonal&lt;BR /&gt;
	-3.0870 -2.0660 -1.8731 -2.0022&lt;BR /&gt;
	Super-diagonal&lt;BR /&gt;
	2.1126 -1.2628 1.6126&lt;/P&gt;</description>
      <pubDate>Wed, 19 Jul 2017 00:12:29 GMT</pubDate>
      <guid>https://community.intel.com/t5/Intel-oneAPI-Math-Kernel-Library/About-MKL-bidiagonal-decomposition/m-p/1150155#M27055</guid>
      <dc:creator>Zhonghan_L_</dc:creator>
      <dc:date>2017-07-19T00:12:29Z</dc:date>
    </item>
    <item>
      <title>Hi Zhonghan,</title>
      <link>https://community.intel.com/t5/Intel-oneAPI-Math-Kernel-Library/About-MKL-bidiagonal-decomposition/m-p/1150156#M27056</link>
      <description>&lt;P&gt;Hi&amp;nbsp;&lt;SPAN style="font-size: 1em;"&gt;Zhonghan,&lt;/SPAN&gt;&lt;/P&gt;

&lt;P&gt;I am afraid your code implementation is wrong. The bidiagonal matrix B just return as float array to s1 &amp;amp; s2 which s1 store diagonal elements, and s2 store super-diagonal. However, t&lt;SPAN style="font-size: 13.008px;"&gt;he ?&lt;/SPAN&gt;&lt;SPAN style="font-size: 13.008px;"&gt;unmbr is to calculate complex matrix C multiply with Q or P.&lt;/SPAN&gt;&amp;nbsp;I did not find any place you setting s1 &amp;amp;s2 to the real part of complex matrix S to computer S=S*Q, S=S*P&lt;SUP&gt;H&lt;/SUP&gt;.&amp;nbsp;&amp;nbsp;&lt;/P&gt;

&lt;P&gt;Best regards,&lt;BR /&gt;
	Fiona&lt;/P&gt;</description>
      <pubDate>Wed, 19 Jul 2017 09:19:24 GMT</pubDate>
      <guid>https://community.intel.com/t5/Intel-oneAPI-Math-Kernel-Library/About-MKL-bidiagonal-decomposition/m-p/1150156#M27056</guid>
      <dc:creator>Zhen_Z_Intel</dc:creator>
      <dc:date>2017-07-19T09:19:24Z</dc:date>
    </item>
    <item>
      <title>Quote:Fiona Z. (Intel) wrote:</title>
      <link>https://community.intel.com/t5/Intel-oneAPI-Math-Kernel-Library/About-MKL-bidiagonal-decomposition/m-p/1150157#M27057</link>
      <description>&lt;P&gt;&lt;/P&gt;&lt;BLOCKQUOTE&gt;Fiona Z. (Intel) wrote:&lt;BR /&gt;&lt;P&gt;&lt;/P&gt;

&lt;P&gt;Hi&amp;nbsp;Zhonghan,&lt;/P&gt;

&lt;P&gt;I am afraid your code implementation is wrong. The bidiagonal matrix B just return as float array to s1 &amp;amp; s2 which s1 store diagonal elements, and s2 store super-diagonal. However, the ?unmbr is to calculate complex matrix C multiply with Q or P.&amp;nbsp;I did not find any place you setting s1 &amp;amp;s2 to the real part of complex matrix S to computer S=S*Q, S=S*P&lt;SUP&gt;H&lt;/SUP&gt;.&amp;nbsp;&amp;nbsp;&lt;/P&gt;

&lt;P&gt;Best regards,&lt;BR /&gt;
	Fiona&lt;/P&gt;

&lt;P&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;&lt;P&gt;&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&lt;/P&gt;

&lt;P&gt;Hi Fiona,&lt;/P&gt;

&lt;P&gt;Thanks for your response! I didn't attach&amp;nbsp;whole part of the code, I did set s1 and s2, sorry for the confuse. As you said, the s1 and s2 consist the bidiagonal term, and in my another comment it also unable to yield the correct bidiagonal result when comes with the complex number. Also there was a little typo in my first post(which won't affect the output bidiagonal terms), the order of TP and TQ is mistaken, should be&lt;/P&gt;

&lt;P&gt;&lt;FONT face="Courier New"&gt;LAPACKE_cgebrd(LAPACK_ROW_MAJOR, length[1], length[0], Spec, length[0], s1, s2, TQ, TP); &lt;/FONT&gt;&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&lt;/P&gt;

&lt;P&gt;Best regards,&lt;/P&gt;

&lt;P&gt;Zhonghan&lt;/P&gt;</description>
      <pubDate>Wed, 19 Jul 2017 14:18:00 GMT</pubDate>
      <guid>https://community.intel.com/t5/Intel-oneAPI-Math-Kernel-Library/About-MKL-bidiagonal-decomposition/m-p/1150157#M27057</guid>
      <dc:creator>Zhonghan_L_</dc:creator>
      <dc:date>2017-07-19T14:18:00Z</dc:date>
    </item>
    <item>
      <title>Hi Zhonghan,</title>
      <link>https://community.intel.com/t5/Intel-oneAPI-Math-Kernel-Library/About-MKL-bidiagonal-decomposition/m-p/1150158#M27058</link>
      <description>&lt;P&gt;Hi Zhonghan,&lt;/P&gt;

&lt;P&gt;I do believe the result of MKL function is correct. Please follow below program:&lt;/P&gt;

&lt;PRE class="brush:cpp;"&gt;#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;stdlib.h&amp;gt;
#include &amp;lt;mkl.h&amp;gt;

int main()
{
	float x_real[6 * 4] = { 
		0.96, -0.03, -0.91, -0.05, 
		-0.98, -1.20, -0.66, -0.81, 
		0.62, 1.01, 0.63, -1.11, 
		-0.37, 0.19, -0.98, 0.22,
		0.83, 0.20,-0.17, 1.47,
		1.08, 0.20, -0.07, 0.26};
	float x_imag[6*4] = {
		-0.81, 0.96, 2.06, 0.41, 
		1.98, 0.19, 0.42, 0.56,
		-0.46, 0.02,-0.17, 0.60, 
		0.38,-0.54,-0.36,-0.20,
		0.51, 0.01,-0.46, 1.59,
		-0.28,-0.12, 1.23, 0.26};

	int length[2] = { 4, 6 };

	MKL_Complex8* P = (MKL_Complex8*)MKL_malloc(sizeof(MKL_Complex8)*4*4, 32); 
	MKL_Complex8* Q = (MKL_Complex8*)MKL_malloc(sizeof(MKL_Complex8)*6*6, 32);
	MKL_Complex8* TP = (MKL_Complex8*)MKL_malloc(sizeof(MKL_Complex8)*4, 32);
	MKL_Complex8* TQ = (MKL_Complex8*)MKL_malloc(sizeof(MKL_Complex8)*4, 32);
	MKL_Complex8* Spec = (MKL_Complex8*)MKL_malloc(sizeof(MKL_Complex8)*4*6,32); 
	MKL_Complex8* S = (MKL_Complex8*)MKL_malloc(sizeof(MKL_Complex8)*6*4,32); 

	float s1[4];
	float s2[3];

	for (int j = 0; j &amp;lt; length[0] * length[1]; j++)
	{
	 Spec&lt;J&gt;.real = x_real&lt;J&gt;;
	 Spec&lt;J&gt;.imag = x_imag&lt;J&gt;;
	} 

	LAPACKE_cgebrd(LAPACK_ROW_MAJOR, length[1], length[0], Spec, length[0], s1, s2, TQ, TP); //here is correct

	printf("Matrix C:\n");
	for(int i=0;i&amp;lt;length[1];i++)
	{
		for(int j=0;j&amp;lt;length[0];j++)
		{
			S[i*length[0]+j].real=0;
			S[i*length[0]+j].imag=0;
			if(i==j)
			{
				S[i*length[0]+j].real=s1&lt;J&gt;;
			}
			else if(j-i==1)
			{
				S[i*length[0]+j].real=s2[j-1];
			}
			printf("%f+%fi\t",S[i*length[0]+j].real,S[i*length[0]+j].imag);
		}
		printf("\n");
	}
	
	LAPACKE_cunmbr(LAPACK_ROW_MAJOR, 'Q', 'L', 'N', length[1], length[0], length[0], Spec, length[0], TQ, S, length[0]);

	LAPACKE_cunmbr(LAPACK_ROW_MAJOR, 'P', 'R', 'C', length[1], length[0], length[1], Spec, length[0], TP, S, length[0]);
	printf("real part of Q*C*P':\n");
	for(int i=0;i&amp;lt;length[1];i++)
	{
		for(int k=0;k&amp;lt;length[0];k++)
		{
			printf("%f\t", S[i*length[0]+k].real);
		}
		printf("\n");
	}
	printf("\nimag part of Q*C*P':\n");
	for(int i=0;i&amp;lt;length[1];i++)
	{
		for(int k=0;k&amp;lt;length[0];k++)
		{
			printf("%f\t", S[i*length[0]+k].imag);
		}
		printf("\n");
	}


	return 0;
}&lt;/J&gt;&lt;/J&gt;&lt;/J&gt;&lt;/J&gt;&lt;/J&gt;&lt;/PRE&gt;

&lt;P&gt;The matrix A can get by multiplied back by using ?unmber function.&lt;/P&gt;

&lt;P&gt;Best regards,&lt;BR /&gt;
	Fiona&lt;/P&gt;</description>
      <pubDate>Fri, 21 Jul 2017 03:25:49 GMT</pubDate>
      <guid>https://community.intel.com/t5/Intel-oneAPI-Math-Kernel-Library/About-MKL-bidiagonal-decomposition/m-p/1150158#M27058</guid>
      <dc:creator>Zhen_Z_Intel</dc:creator>
      <dc:date>2017-07-21T03:25:49Z</dc:date>
    </item>
    <item>
      <title>Another point is about the</title>
      <link>https://community.intel.com/t5/Intel-oneAPI-Math-Kernel-Library/About-MKL-bidiagonal-decomposition/m-p/1150159#M27059</link>
      <description>&lt;P&gt;Another point is about the result of bidiagonal matrix B. The result of factorization would not be the only. For example, 1 can be factorized as 1*1, also can be -1*-1, it is depends on the algorithm of factorization. If you get the result with different sign, that means the elements in Q or P&lt;SUP&gt;H&lt;/SUP&gt; maybe also different. It would be fine the results only with different sign. You could use ?ungbr to generate Q and P to check.&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Fri, 21 Jul 2017 03:41:27 GMT</pubDate>
      <guid>https://community.intel.com/t5/Intel-oneAPI-Math-Kernel-Library/About-MKL-bidiagonal-decomposition/m-p/1150159#M27059</guid>
      <dc:creator>Zhen_Z_Intel</dc:creator>
      <dc:date>2017-07-21T03:41:27Z</dc:date>
    </item>
  </channel>
</rss>

