Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
        /// <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));
        }
Exemplo n.º 3
0
        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);
        }
Exemplo n.º 4
0
        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)));
        }