# 2.1.17.6.10 SVD

## Description

Singular value decomposition of complex matrix

Get the diagonal matrix of Singular value decomposition of complex matrix

Get the diagonal matrix of Singular value decomposition of real matrix

Singular value decomposition of real matrix

## Syntax

int SVD( matrix<complex> & matSource, matrix & matS, matrix<complex> & matU, matrix<complex> & matV )

int SVD( matrix<complex> & matSource, matrix & matS )

int SVD( matrix & matSource, matrix & matS )

int SVD( matrix & matSource, matrix & matS, matrix & matU, matrix & matV )

## Parameters

matSource
[input]The source matrix
matS
[output]A diagonal matrix of Singular value decomposition
matU
[output]A unitary matrix of Singular value decomposition
matV
[input]A unitary matrix of Singular value decomposition

matSource
[input]The source matrix
matS
[output]A diagonal matrix of Singular value decomposition

matSource
[input]The source matrix
matS
[output]A diagonal matrix of Singular value decomposition

matSource
[input]The source matrix
matS
[output]A diagonal matrix of Singular value decomposition
matU
[output]A unitary matrix of Singular value decomposition
matV
[input]A unitary matrix of Singular value decomposition

## Return

Returns 0 on successful exit

Returns 0 on successful exit

Returns 0 on successful exit

## Examples

EX1

int SVD_ex1()
{
matrix<complex> matSource = {{1+3i, 2+4i, 3+2i},{5+8i, 6+9i, 7+10i},{9+12i, 10+1i, 11+3i}};
printf("The source complex matrix:\n");
int ii, jj;
int nNumCols = matSource.GetNumCols();
int nNumRows = matSource.GetNumRows();
for(ii = 0; ii < nNumRows; ii++)
{
for(jj = 0; jj < nNumCols; jj++)
out_complex("", matSource[ii][jj]);
printf("\n");
}

matrix matS;
matrix<complex> matU, matV;
int nRet = SVD(matSource, matS, matU, matV);
if(nRet != 0)
{
printf("SVD failed!");
return -1;
}
printf("The result three matrices are:\n");
printf("S:\n");
for(ii = 0; ii < nNumRows; ii++)
{
for(jj = 0; jj < nNumCols; jj++)
printf("\t%f", matS[ii][jj]);
printf("\n");
}

printf("U:\n");
for(ii = 0; ii < matU.GetNumRows(); ii++)
{
for(jj = 0; jj < matU.GetNumCols(); jj++)
out_complex("", matU[ii][jj]);
printf("\n");
}

printf("V:\n");
for(ii = 0; ii < matV.GetNumRows(); ii++)
{
for(jj = 0; jj < matV.GetNumCols(); jj++)
out_complex("\t", matV[ii][jj]);
printf("\n");
}

return 0;
}

EX2

int SVD_ex2()
{
matrix<complex> matSource = {{1+3i, 2+4i, 3+2i},{5+8i, 6+9i, 7+10i},{9+12i, 10+1i, 11+3i}};
printf("The source complex matrix:\n");
int ii, jj;
int nNumCols = matSource.GetNumCols();
int nNumRows = matSource.GetNumRows();
for(ii = 0; ii < nNumRows; ii++)
{
for(jj = 0; jj < nNumCols; jj++)
out_complex("", matSource[ii][jj]);
printf("\n");
}

matrix matS;
//matrix<complex> matU, matV;
int nRet = SVD(matSource, matS);
if(nRet != 0)
{
printf("SVD failed!");
return -1;
}
printf("The result matrix:\n");
printf("S:\n");
for(ii = 0; ii < nNumRows; ii++)
{
for(jj = 0; jj < nNumCols; jj++)
printf("\t%f", matS[ii][jj]);
printf("\n");
}

return 0;
}

EX3

int SVD_ex3()
{
matrix matSource = {{1,2,3},{5,6,7},{9,10,11}};
printf("The source complex matrix:\n");
int ii, jj;
int nNumCols = matSource.GetNumCols();
int nNumRows = matSource.GetNumRows();
for(ii = 0; ii < nNumRows; ii++)
{
for(jj = 0; jj < nNumCols; jj++)
out_complex("", matSource[ii][jj]);
printf("\n");
}

matrix matS;
//matrix<complex> matU, matV;
int nRet = SVD(matSource, matS);
if(nRet != 0)
{
printf("SVD failed!");
return -1;
}
printf("The result matrix:\n");
printf("S:\n");
for(ii = 0; ii < nNumRows; ii++)
{
for(jj = 0; jj < nNumCols; jj++)
printf("\t%f", matS[ii][jj]);
printf("\n");
}

return 0;
}

EX4

int SVD_ex4()
{
matrix matSource = {{1,2,3},{5,6,7},{9,10,11}};
printf("The source complex matrix:\n");
int ii, jj;
int nNumCols = matSource.GetNumCols();
int nNumRows = matSource.GetNumRows();
for(ii = 0; ii < nNumRows; ii++)
{
for(jj = 0; jj < nNumCols; jj++)
printf("\t%f", matSource[ii][jj]);
printf("\n");
}

matrix matS, matU, matV;
int nRet = SVD(matSource, matS, matU, matV);
if(nRet != 0)
{
printf("SVD failed!");
return -1;
}
printf("The result three matrices are:\n");
printf("S:\n");
for(ii = 0; ii < nNumRows; ii++)
{
for(jj = 0; jj < nNumCols; jj++)
printf("\t%f", matS[ii][jj]);
printf("\n");
}

printf("U:\n");
for(ii = 0; ii < matU.GetNumRows(); ii++)
{
for(jj = 0; jj < matU.GetNumCols(); jj++)
printf("\t%f", matU[ii][jj]);
printf("\n");
}

printf("V:\n");
for(ii = 0; ii < matV.GetNumRows(); ii++)
{
for(jj = 0; jj < matV.GetNumCols(); jj++)
printf("\t%f", matV[ii][jj]);
printf("\n");
}

return 0;
}