/// <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)); }
/// <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); }
/// <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); }