Click or drag to resize

SingularValueDecomposition Class

Provides methods to compute the Singular Value Decomposition of a matrix.
Inheritance Hierarchy
SystemObject
  Novacta.Analytics.AdvancedSingularValueDecomposition

Namespace:  Novacta.Analytics.Advanced
Assembly:  Novacta.Analytics (in Novacta.Analytics.dll) Version: 2.0.0
Syntax
public static class SingularValueDecomposition
Methods
Remarks

Let LaTeX equation be a matrix having LaTeX equation rows and LaTeX equation columns.

The Singular Value Decomposition (SVD) of LaTeX equation is a factorization having the following form:

LaTeX equation

where LaTeX equation returns the conjugate transpose of LaTeX equation, LaTeX equation and LaTeX equation are unitary complex matrices having sizes LaTeX equation and LaTeX equation, respectively, and LaTeX equation is a diagonal LaTeX equation real matrix. Matrix LaTeX equation has columns known as left singular vectors. Matrix LaTeX equation has diagonal entries known as the singular values of LaTeX equation. Finally, matrix LaTeX equation has rows that represent the conjugate transposed right singular vectors of LaTeX equation.

Method Decompose(DoubleMatrix, DoubleMatrix, DoubleMatrix) and its overloads compute matrices LaTeX equation, LaTeX equation, and LaTeX equation for double or complex matrices.

Method GetSingularValues(DoubleMatrix) and its overloads return the singular values involved in a decomposition, without computing the corresponding singular vectors.

Examples

In the following example, the SVD of a matrix is computed.

Computing the SVD of a matrix
using System;
using Novacta.Analytics.Advanced;

namespace Novacta.Analytics.CodeExamples.Advanced
{
    public class SingularValueDecompositionExample0  
    {
        public void Main()
        {
            // Create a matrix.
            var data = new double[6] {
                1, 8,
                2, 2,
               -3, 9
            };
            var matrix = DoubleMatrix.Dense(3, 2, data, StorageOrder.RowMajor);
            Console.WriteLine("Matrix to be decomposed:");
            Console.WriteLine(matrix);

            // Compute its SVD.
            var singularValues = SingularValueDecomposition.Decompose(
                matrix,
                out DoubleMatrix leftSingularVectors,
                out DoubleMatrix conjugateTransposedRightSingularVectors);

            Console.WriteLine(); 
            Console.WriteLine("Singular values:");
            Console.WriteLine(singularValues);
            Console.WriteLine();
            Console.WriteLine("Left singular vectors:");
            Console.WriteLine(leftSingularVectors);
            Console.WriteLine();
            Console.WriteLine("Conjugate transposed right singular vectors:");
            Console.WriteLine(conjugateTransposedRightSingularVectors);
            Console.WriteLine();
            Console.WriteLine("Matrix reconstruction:");
            var v = singularValues;
            var l = leftSingularVectors;
            var rh = conjugateTransposedRightSingularVectors;
            Console.WriteLine(l * v * rh);
        }
    }
}

// Executing method Main() produces the following output:
// 
// Matrix to be decomposed:
// 1                8                
// 2                2                
// -3               9                
// 
// 
// 
// Singular values:
// 12.273817        0                
// 0                3.51474275       
// 0                0                
// 
// 
// 
// Left singular vectors:
// 0.639011869      0.531180587      0.556337142      
// 0.144195105      0.627724866      -0.76496357      
// 0.755560456      -0.569041894     -0.32453         
// 
// 
// 
// Conjugate transposed right singular vectors:
// -0.109116772     0.994028938      
// 0.994028938      0.109116772      
// 
// 
// 
// Matrix reconstruction:
// 1                8                
// 2                2                
// -3               9                
// 

See Also