package edu.harvard.mcb.leschziner.analyze;
import com.googlecode.javacv.cpp.opencv_core.CvMat;
public class QRDecomposer {
public static QRFactors decompose(CvMat target) {
/*
* CvMat QR = target.clone();
*
* int targetRows = target.rows(); int targetCols = target.cols(); int N
* = Math.min(targetCols, targetRows); double[] gammas = new
* double[targetCols];
*
* for (int i = 0; i < N; i++) { CvMat A_small = CvMat.create(targetRows
* - i, targetCols - i, opencv_core.CV_32FC1); CvMat A_mod =
* CvMat.create(A_small.rows(), A_small.cols(), opencv_core.CV_32FC1);
* CvMat v = CvMat.create(A_small.rows(), 1, opencv_core.CV_32FC1);
* CvMat Q_k = CvMat.create(v.rows(), v.rows(), opencv_core.CV_32FC1);
*
* // use extract matrix to get the column that is to be zeroed
* CommonOps.extract(QR, i, targetRows, i, i + 1, v, 0, 0);
*
* double[] maxArray = new double[1]; opencv_core.cvMinMaxLoc(v, new
* double[1], maxArray); double max = maxArray[0];
*
* if (max > 0 && v.rows() > 1) { // normalize to reduce overflow issues
* CommonOps.divide(max, v);
*
* // compute the magnitude of the vector double tau =
* opencv_core.cvNorm(v);
*
* if (v.get(0) < 0) tau *= -1.0;
*
* double u_0 = v.get(0) + tau; double gamma = u_0 / tau;
*
* CommonOps.divide(u_0, v); v.put(0, 1.0); // extract the submatrix of
* A which is being operated on CommonOps.extract(QR, i, targetRows, i,
* targetCols, A_small, 0, 0);
*
* // A = (I - γ*u*u<sup>T</sup>)A CommonOps.setIdentity(Q_k);
* CommonOps.multAddTransB(-gamma, v, v, Q_k); CommonOps.mult(Q_k,
* A_small, A_mod);
*
* // save the results CommonOps.insert(A_mod, QR, i, i);
* CommonOps.insert(v, QR, i, i); QR.unsafe_set(i, i, -tau * max);
*
* // save gamma for recomputing Q later on gammas[i] = gamma; } }
*
* // Calculate Q CvMat Q = CommonOps.identity(targetRows); CvMat Q_k =
* CvMat.create(targetRows, targetRows); CvMat u =
* CvMat.create(targetRows, 1);
*
* CvMat temp = CvMat.create(targetRows, targetRows);
*
* // compute Q by first extracting the householder vectors from the //
* columns of QR and then applying it to Q for (int j = N - 1; j >= 0;
* j--) { if (j + 1 < N) u.set(j + 1, 0);
*
* CommonOps.extract(QR, j, targetRows, j, j + 1, u, j, 0); u.set(j,
* 1.0);
*
* // A = (I - γ*u*u<sup>T</sup>)*A<br>
* CommonOps.setIdentity(Q_k); CommonOps.multAddTransB(-gammas[j], u, u,
* Q_k); CommonOps.mult(Q_k, Q, temp); Q.set(temp); }
*
* // Calculate R CvMat R = CvMat.create(targetRows, targetCols);
*
* for (int i = 0; i < N; i++) { for (int j = i; j < targetCols; j++) {
* R.unsafe_set(i, j, QR.unsafe_get(i, j)); } }
*/
return null;
}
}