public void LeastSquaresSVD_ShouldSucceed(SVDType sdvType) { var A = new MatrixXD("-1 -0.0827; -0.737 0.0655; 0.511 -0.562 "); var rhs = new VectorXD("-0.906 0.358 0.359"); VectorXD result = A.LeastSquaresSVD(rhs, sdvType); Assert.Equal(new VectorXD("0.46347421844577846 0.04209165616389611"), result); }
/// <summary> /// /// </summary> /// <param name="rhs"></param> public VectorXD LeastSquaresSVD(VectorXD rhs, SVDType svdType = SVDType.Jacobi) { double[] vout = new double[Cols]; if (svdType == SVDType.Jacobi) { EigenDenseUtilities.SVDLeastSquares(GetValues(), Rows, Cols, rhs.GetValues(), vout); } else { EigenDenseUtilities.SVDLeastSquaresBdcSvd(GetValues(), Rows, Cols, rhs.GetValues(), vout); } return(new VectorXD(vout)); }
public void SVD_ShouldSucceed(SVDType sdvType) { var A = new MatrixXD("3 2 2 ; 2 3 -2"); SVDResult result = A.SVD(sdvType); Assert.Equal(new MatrixXD("-0.7071067811865476 0.7071067811865475 ;" + " -0.7071067811865475 -0.7071067811865476"), result.U); Assert.Equal(new[] { 5.0, 3.0 }, result.S.GetValues().ToArray()); Assert.Equal(new MatrixXD("-0.7071067811865477 0.23570226039551567; " + "-0.7071067811865475 -0.23570226039551567; " + "-2.220446049250313E-16 0.94280904158206336"), result.V); }
public SVDResult SVD(SVDType svdType = SVDType.Jacobi) { int minRowsCols = Cols < Rows ? Cols : Rows; double[] uout = new double[Rows * minRowsCols]; double[] sout = new double[minRowsCols]; double[] vout = new double[Cols * minRowsCols]; if (svdType == SVDType.Jacobi) { EigenDenseUtilities.SVD(GetValues(), Rows, Cols, uout, sout, vout); } else { EigenDenseUtilities.SVDBdcSvd(GetValues(), Rows, Cols, uout, sout, vout); } return(new SVDResult(new MatrixXD(uout, Rows, minRowsCols), new VectorXD(sout), new MatrixXD(vout, Cols, minRowsCols))); }