Exemplo n.º 1
0
        /// <summary>
        /// Initializes a new instance of the <see cref="DenseSvd"/> class. This object will compute the
        /// the singular value decomposition when the constructor is called and cache it's decomposition.
        /// </summary>
        /// <param name="matrix">The matrix to factor.</param>
        /// <param name="computeVectors">Compute the singular U and VT vectors or not.</param>
        /// <exception cref="ArgumentNullException">If <paramref name="matrix"/> is <c>null</c>.</exception>
        /// <exception cref="ArgumentException">If SVD algorithm failed to converge with matrix <paramref name="matrix"/>.</exception>
        public static DenseSvd Create(DenseMatrix matrix, bool computeVectors)
        {
            var nm = Math.Min(matrix.RowCount, matrix.ColumnCount);
            var s  = new DenseVector(nm);
            var u  = new DenseMatrix(matrix.RowCount);
            var vt = new DenseMatrix(matrix.ColumnCount);

            MathNetNumerics.ManagedLinearAlgebraProvider svder = new MathNetNumerics.ManagedLinearAlgebraProvider();
            svder.SingularValueDecomposition(computeVectors, ((DenseMatrix)matrix.Clone()).Values, matrix.RowCount, matrix.ColumnCount, s.Values, u.Values, vt.Values);
            //LinearAlgebraControl.Provider.SingularValueDecomposition(computeVectors, ((DenseMatrix) matrix.Clone()).Values, matrix.RowCount, matrix.ColumnCount, s.Values, u.Values, vt.Values);

            return(new DenseSvd(s, u, vt, computeVectors));
        }
Exemplo n.º 2
0
        /// <summary>
        /// Solves a system of linear equations, <b>AX = B</b>, with A SVD factorized.
        /// </summary>
        /// <param name="input">The right hand side <see cref="Matrix{T}"/>, <b>B</b>.</param>
        /// <param name="result">The left hand side <see cref="Matrix{T}"/>, <b>X</b>.</param>
        public override void Solve(Matrix <double> input, Matrix <double> result)
        {
            if (!VectorsComputed)
            {
                throw new InvalidOperationException("Resources.SingularVectorsNotComputed");
            }

            // The solution X should have the same number of columns as B
            if (input.ColumnCount != result.ColumnCount)
            {
                throw new ArgumentException("Resources.ArgumentMatrixSameColumnDimension");
            }

            // The dimension compatibility conditions for X = A\B require the two matrices A and B to have the same number of rows
            if (U.RowCount != input.RowCount)
            {
                throw new ArgumentException("Resources.ArgumentMatrixSameRowDimension");
            }

            // The solution X row dimension is equal to the column dimension of A
            if (VT.ColumnCount != result.RowCount)
            {
                throw new ArgumentException("Resources.ArgumentMatrixSameColumnDimension");
            }

            var dinput = input as DenseMatrix;

            if (dinput == null)
            {
                throw new NotSupportedException("Can only do SVD factorization for dense matrices at the moment.");
            }

            var dresult = result as DenseMatrix;

            if (dresult == null)
            {
                throw new NotSupportedException("Can only do SVD factorization for dense matrices at the moment.");
            }
            MathNetNumerics.ManagedLinearAlgebraProvider svder = new MathNetNumerics.ManagedLinearAlgebraProvider();
            svder.SvdSolveFactored(U.RowCount, VT.ColumnCount, ((DenseVector)S).Values, ((DenseMatrix)U).Values, ((DenseMatrix)VT).Values, dinput.Values, input.ColumnCount, dresult.Values);
            //LinearAlgebraControl.Provider.SvdSolveFactored(U.RowCount, VT.ColumnCount, ((DenseVector) S).Values, ((DenseMatrix) U).Values, ((DenseMatrix) VT).Values, dinput.Values, input.ColumnCount, dresult.Values);
        }
Exemplo n.º 3
0
        /// <summary>
        /// Solves a system of linear equations, <b>Ax = b</b>, with A SVD factorized.
        /// </summary>
        /// <param name="input">The right hand side vector, <b>b</b>.</param>
        /// <param name="result">The left hand side <see cref="Matrix{T}"/>, <b>x</b>.</param>
        public override void Solve(Vector <double> input, Vector <double> result)
        {
            if (!VectorsComputed)
            {
                throw new InvalidOperationException("Resources.SingularVectorsNotComputed");
            }

            // Ax=b where A is an m x n matrix
            // Check that b is a column vector with m entries
            if (U.RowCount != input.Count)
            {
                throw new ArgumentException("Resources.ArgumentVectorsSameLength");
            }

            // Check that x is a column vector with n entries
            if (VT.ColumnCount != result.Count)
            {
                throw Matrix.DimensionsDontMatch <ArgumentException>(VT, result);
            }

            var dinput = input as DenseVector;

            if (dinput == null)
            {
                throw new NotSupportedException("Can only do SVD factorization for dense vectors at the moment.");
            }

            var dresult = result as DenseVector;

            if (dresult == null)
            {
                throw new NotSupportedException("Can only do SVD factorization for dense vectors at the moment.");
            }
            MathNetNumerics.ManagedLinearAlgebraProvider svder = new MathNetNumerics.ManagedLinearAlgebraProvider();
            svder.SvdSolveFactored(U.RowCount, VT.ColumnCount, ((DenseVector)S).Values, ((DenseMatrix)U).Values, ((DenseMatrix)VT).Values, dinput.Values, 1, dresult.Values);
            //LinearAlgebraControl.Provider.SvdSolveFactored(U.RowCount, VT.ColumnCount, ((DenseVector) S).Values, ((DenseMatrix) U).Values, ((DenseMatrix) VT).Values, dinput.Values, 1, dresult.Values);
        }