Exemplo n.º 1
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.º 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 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);
        }