Пример #1
0
        //@Override
        public void solve(DMatrixRMaj B, DMatrixRMaj X)
        {
            double[] b  = TriangularSolver_DSCC.adjust(gb, B.numRows);
            double[] bp = TriangularSolver_DSCC.adjust(gbp, B.numRows);
            double[] x  = TriangularSolver_DSCC.adjust(gx, X.numRows);

            int[] pinv = qr.getStructure().getPinv();

            // process each column in X and B individually
            for (int colX = 0; colX < X.numCols; colX++)
            {
                int index = colX;
                for (int i = 0; i < B.numRows; i++, index += X.numCols)
                {
                    b[i] = B.data[index];
                }

                // apply row pivots
                CommonOps_DSCC.permuteInv(pinv, b, bp, m);

                // apply Householder reflectors
                for (int j = 0; j < n; j++)
                {
                    QrHelperFunctions_DSCC.applyHouseholder(qr.getV(), j, qr.getBeta(j), bp);
                }
                // Solve for R*x = b
                TriangularSolver_DSCC.solveU(qr.getR(), bp);

                // undo the permutation
                double[] output;
                if (qr.isFillPermutated())
                {
                    CommonOps_DSCC.permute(qr.getFillPermutation(), bp, x, X.numRows);
                    output = x;
                }
                else
                {
                    output = bp;
                }

                index = colX;
                for (int i = 0; i < X.numRows; i++, index += X.numCols)
                {
                    X.data[index] = output[i];
                }
            }
        }
Пример #2
0
        //@Override
        public void solve(DMatrixRMaj B, DMatrixRMaj X)
        {
//        if( B.numCols != X.numCols || B.numRows != numRows || X.numRows != numCols) {
//            throw new ArgumentException("Unexpected matrix size");
//        }

            int[]    pinv = decomposition.getPinv();
            int[]    q    = decomposition.getReducePermutation();
            double[] x    = TriangularSolver_DSCC.adjust(gx, X.numRows);
            double[] b    = TriangularSolver_DSCC.adjust(gb, B.numRows);

            DMatrixSparseCSC L = decomposition.getL();
            DMatrixSparseCSC U = decomposition.getU();

            bool reduceFill = decomposition.getReduceFill() != null;

            // process each column in X and B individually
            for (int colX = 0; colX < X.numCols; colX++)
            {
                int index = colX;
                for (int i = 0; i < B.numRows; i++, index += X.numCols)
                {
                    b[i] = B.data[index];
                }

                CommonOps_DSCC.permuteInv(pinv, b, x, X.numRows);
                TriangularSolver_DSCC.solveL(L, x);
                TriangularSolver_DSCC.solveU(U, x);
                double[] d;
                if (reduceFill)
                {
                    CommonOps_DSCC.permute(q, x, b, X.numRows);
                    d = b;
                }
                else
                {
                    d = x;
                }
                index = colX;
                for (int i = 0; i < X.numRows; i++, index += X.numCols)
                {
                    X.data[index] = d[i];
                }
            }
        }
Пример #3
0
        //@Override
        public void solve(DMatrixRMaj B, DMatrixRMaj X)
        {
            DMatrixSparseCSC L = cholesky.getL();

            int N = L.numRows;

            double[] b = TriangularSolver_DSCC.adjust(gb, N);
            double[] x = TriangularSolver_DSCC.adjust(gx, N);

            int[] Pinv = reduce.getArrayPinv();

            for (int col = 0; col < B.numCols; col++)
            {
                int index = col;
                for (int i = 0; i < N; i++, index += B.numCols)
                {
                    b[i] = B.data[index];
                }

                if (Pinv != null)
                {
                    CommonOps_DSCC.permuteInv(Pinv, b, x, N);
                    TriangularSolver_DSCC.solveL(L, x);
                    TriangularSolver_DSCC.solveTranL(L, x);
                    CommonOps_DSCC.permute(Pinv, x, b, N);
                }
                else
                {
                    TriangularSolver_DSCC.solveL(L, b);
                    TriangularSolver_DSCC.solveTranL(L, b);
                }

                index = col;
                for (int i = 0; i < N; i++, index += X.numCols)
                {
                    X.data[index] = b[i];
                }
            }
        }