public override bool setA(FMatrixRMaj A) { _setA(A); if (!decomposition.decompose(A)) { return(false); } rank = decomposition.getRank(); R.reshape(numRows, numCols); decomposition.getR(R, false); // extract the r11 triangle sub matrix R11.reshape(rank, rank); CommonOps_FDRM.extract(R, 0, rank, 0, rank, R11, 0, 0); if (norm2Solution && rank < numCols) { // extract the R12 sub-matrix W.reshape(rank, numCols - rank); CommonOps_FDRM.extract(R, 0, rank, rank, numCols, W, 0, 0); // W=inv(R11)*R12 TriangularSolver_FDRM.solveU(R11.data, 0, R11.numCols, R11.numCols, W.data, 0, W.numCols, W.numCols); // set the identity matrix in the upper portion W.reshape(numCols, W.numCols, true); for (int i = 0; i < numCols - rank; i++) { for (int j = 0; j < numCols - rank; j++) { if (i == j) { W.set(i + rank, j, -1); } else { W.set(i + rank, j, 0); } } } } return(true); }
public virtual bool decompose(FMatrixRMaj orig) { if (!decompQRP.decompose(orig)) { return(false); } m = orig.numRows; n = orig.numCols; min = Math.Min(m, n); B.reshape(min, n, false); decompQRP.getR(B, true); // apply the column pivots. // TODO this is horribly inefficient FMatrixRMaj result = new FMatrixRMaj(min, n); FMatrixRMaj P = decompQRP.getColPivotMatrix(null); CommonOps_FDRM.multTransB(B, P, result); B.set(result); return(decompBi.decompose(B)); }