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