/// <summary>Performs the QR factorization.</summary> protected override void InternalCompute() { int m = matrix.RowCount; int n = matrix.ColumnCount; #if MANAGED int minmn = m < n ? m : n; r_ = new DoubleMatrix(matrix); // create a copy var u = new DoubleVector[minmn]; for (int i = 0; i < minmn; i++) { u[i] = Householder.GenerateColumn(r_, i, m - 1, i); Householder.UA(u[i], r_, i, m - 1, i + 1, n - 1); } q_ = DoubleMatrix.CreateIdentity(m); for (int i = minmn - 1; i >= 0; i--) { Householder.UA(u[i], q_, i, m - 1, i, m - 1); } #else qr = new double[matrix.data.Length]; Array.Copy(matrix.data, qr, matrix.data.Length); jpvt = new int[n]; jpvt[0] = 1; Lapack.Geqp3.Compute(m, n, qr, m, jpvt, out tau); r_ = new DoubleMatrix(m, n); // Populate R for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { if (i <= j) { r_.data[j * m + i] = qr[(jpvt[j] - 1) * m + i]; } else { r_.data[j * m + i] = 0.0; } } } q_ = new DoubleMatrix(m, m); for (int i = 0; i < m; i++) { for (int j = 0; j < m; j++) { if (j < n) { q_.data[j * m + i] = qr[j * m + i]; } else { q_.data[j * m + i] = 0.0; } } } if (m < n) { Lapack.Orgqr.Compute(m, m, m, q_.data, m, tau); } else { Lapack.Orgqr.Compute(m, m, n, q_.data, m, tau); } #endif for (int i = 0; i < m; i++) { if (q_[i, i] == 0) { isFullRank = false; } } }
/// <summary>Performs the QR factorization.</summary> protected override void InternalCompute() { int m = matrix.Rows; int n = matrix.Columns; #if MANAGED int minmn = m < n ? m : n; r_ = new ComplexFloatMatrix(matrix); // create a copy ComplexFloatVector[] u = new ComplexFloatVector[minmn]; for (int i = 0; i < minmn; i++) { u[i] = Householder.GenerateColumn(r_, i, m - 1, i); Householder.UA(u[i], r_, i, m - 1, i + 1, n - 1); } q_ = ComplexFloatMatrix.CreateIdentity(m); for (int i = minmn - 1; i >= 0; i--) { Householder.UA(u[i], q_, i, m - 1, i, m - 1); } #else qr = ComplexFloatMatrix.ToLinearComplexArray(matrix); jpvt = new int[n]; jpvt[0] = 1; Lapack.Geqp3.Compute(m, n, qr, m, jpvt, out tau); r_ = new ComplexFloatMatrix(m, n); // Populate R for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { if (i <= j) { r_.data[j * m + i] = qr[(jpvt[j] - 1) * m + i]; } else { r_.data[j * m + i] = ComplexFloat.Zero; } } } q_ = new ComplexFloatMatrix(m, m); for (int i = 0; i < m; i++) { for (int j = 0; j < m; j++) { if (j < n) { q_.data[j * m + i] = qr[j * m + i]; } else { q_.data[j * m + i] = ComplexFloat.Zero; } } } if (m < n) { Lapack.Ungqr.Compute(m, m, m, q_.data, m, tau); } else { Lapack.Ungqr.Compute(m, m, n, q_.data, m, tau); } #endif for (int i = 0; i < m; i++) { if (q_[i, i] == 0) { isFullRank = false; } } }