/** * <p> * Computes the householder vector "u" for the first column of submatrix j. The already computed * norm is used and checks to see if the matrix is singular at this point. * </p> * <p> * Q = I - γuu<sup>T</sup> * </p> * <p> * This function finds the values of 'u' and 'γ'. * </p> * * @param j Which submatrix to work off of. * @return false if it is degenerate */ protected bool householderPivot(int j) { double[] u = dataQR[j]; // find the largest value in this column // this is used to normalize the column and mitigate overflow/underflow double max = QrHelperFunctions_DDRM.findMax(u, j, numRows - j); if (max <= singularThreshold * maxValueAbs) { return(false); } else { // computes tau and normalizes u by max tau = QrHelperFunctions_DDRM.computeTauAndDivide(j, numRows, u, max); // divide u by u_0 double u_0 = u[j] + tau; QrHelperFunctions_DDRM.divideElements(j + 1, numRows, u, u_0); gamma = u_0 / tau; tau *= max; u[j] = -tau; } gammas[j] = gamma; return(true); }
/** * <p> * Computes the householder vector "u" for the first column of submatrix j. Note this is * a specialized householder for this problem. There is some protection against * overfloaw and underflow. * </p> * <p> * Q = I - γuu<sup>T</sup> * </p> * <p> * This function finds the values of 'u' and 'γ'. * </p> * * @param j Which submatrix to work off of. */ protected void householder(int j) { double[] u = dataQR[j]; // find the largest value in this column // this is used to normalize the column and mitigate overflow/underflow double max = QrHelperFunctions_DDRM.findMax(u, j, numRows - j); if (max == 0.0) { gamma = 0; error = true; } else { // computes tau and normalizes u by max tau = QrHelperFunctions_DDRM.computeTauAndDivide(j, numRows, u, max); // divide u by u_0 double u_0 = u[j] + tau; QrHelperFunctions_DDRM.divideElements(j + 1, numRows, u, u_0); gamma = u_0 / tau; tau *= max; u[j] = -tau; } gammas[j] = gamma; }
/** * <p> * Computes the householder vector "u" for the first column of submatrix j. Note this is * a specialized householder for this problem. There is some protection against * overflow and underflow. * </p> * <p> * Q = I - γuu<sup>T</sup> * </p> * <p> * This function finds the values of 'u' and 'γ'. * </p> * * @param j Which submatrix to work off of. */ protected void householder(int j) { int startQR = j * numRows; int endQR = startQR + numRows; startQR += j; double max = QrHelperFunctions_DDRM.findMax(QR.data, startQR, numRows - j); if (max == 0.0) { gamma = 0; error = true; } else { // computes tau and normalizes u by max tau = QrHelperFunctions_DDRM.computeTauAndDivide(startQR, endQR, QR.data, max); // divide u by u_0 double u_0 = QR.data[startQR] + tau; QrHelperFunctions_DDRM.divideElements(startQR + 1, endQR, QR.data, u_0); gamma = u_0 / tau; tau *= max; QR.data[startQR] = -tau; } gammas[j] = gamma; }