private void solveUsingTriangle(double real, int index, DMatrixRMaj r)
        {
            for (int i = 0; i < index; i++)
            {
                _implicit.A.add(i, i, -real);
            }

            SpecializedOps_DDRM.subvector(_implicit.A, 0, index, index, false, 0, r);
            CommonOps_DDRM.changeSign(r);

            TriangularSolver_DDRM.solveU(_implicit.A.data, r.data, _implicit.A.numRows, 0, index);

            for (int i = 0; i < index; i++)
            {
                _implicit.A.add(i, i, real);
            }
        }
Exemplo n.º 2
0
        /// <summary>
        /// Extracts a row or column from this matrix.
        /// The returned vector will either be a row
        /// or column vector depending on the input type.
        /// </summary>
        /// <param name="extractRow">If true a row will be extracted.</param>
        /// <param name="element">The row or column the vector is contained in.</param>
        /// <returns>Extracted vector.</returns>
        public override SimpleMatrixD extractVector(bool extractRow, int element)
        {
            int length = extractRow ? mat.getNumCols() : mat.getNumRows();

            SimpleMatrixD ret = extractRow ? createMatrix(1, length) : createMatrix(length, 1);

            var rm = ret.getMatrix();

            if (extractRow)
            {
                SpecializedOps_DDRM.subvector(mat, element, 0, length, true, 0, rm);
            }
            else
            {
                SpecializedOps_DDRM.subvector(mat, 0, element, length, false, 0, rm);
            }

            return(ret);
        }
        private void solveWithLU(double real, int index, DMatrixRMaj r)
        {
            DMatrixRMaj A = new DMatrixRMaj(index, index);

            CommonOps_DDRM.extract(_implicit.A, 0, index, 0, index, A, 0, 0);

            for (int i = 0; i < index; i++)
            {
                A.add(i, i, -real);
            }

            r.reshape(index, 1, false);

            SpecializedOps_DDRM.subvector(_implicit.A, 0, index, index, false, 0, r);
            CommonOps_DDRM.changeSign(r);

            // TODO this must be very inefficient
            if (!solver.setA(A))
            {
                throw new InvalidOperationException("Solve failed");
            }
            solver.solve(r, r);
        }