public static Eigendecomp Eigendecomposition(Matrix matrix, double eps)
        {
            Eigendecomp result = new Eigendecomp();

            result.Compute(matrix, eps);
            return(result);
        }
        private void Swap(Eigendecomp eigendecomp, int first, int second)
        {
            double b = eigendecomp.Eigenvalues[first];

            eigendecomp.Eigenvalues[first]  = eigendecomp.Eigenvalues[second];
            eigendecomp.Eigenvalues[second] = b;
            Vector vec = eigendecomp.Eigenvectors[first].Copy();

            eigendecomp.Eigenvectors[first]  = eigendecomp.Eigenvectors[second].Copy();
            eigendecomp.Eigenvectors[second] = vec;
        }
 private void SortEigen(Eigendecomp eigendecomp)
 {
     for (int i = 0; i < 3; i++)
     {
         for (int j = 0; j < 3 - i - 1; j++)
         {
             if (eigendecomp.Eigenvalues[j] < eigendecomp.Eigenvalues[j + 1])
             {
                 Swap(eigendecomp, j, j + 1);
             }
         }
     }
 }
        public void Compute(Matrix matrix, double eps)
        {
            Matrix      g           = matrix.Transpose() * matrix;
            Eigendecomp eigendecomp = MatrixOperations.Eigendecomposition(g, eps);

            SortEigen(eigendecomp);
            Vector sigma = new Vector();

            for (int i = 0; i < matrix.N; i++)
            {
                sigma[i] = Math.Sqrt(Math.Abs(eigendecomp.Eigenvalues[i]));
            }
            V = new Matrix();
            S = Matrix.ZeroMatrix();
            U = new Matrix(eigendecomp.Eigenvectors);
            List <Vector> v = new List <Vector>();

            for (int i = 0; i < matrix.N; i++)
            {
                S[i, i] = sigma[i];
                v.Add(matrix * U.GetColumn(i) / sigma[i]);
            }
            V = new Matrix(v);
        }