public IMapackMatrix Solve(IMapackMatrix rhs) { if (rhs.Rows != L.Rows) { throw new ArgumentException("Matrix dimensions do not match."); } if (!isSymmetric) { throw new InvalidOperationException("Matrix is not symmetric."); } if (!isPositiveDefinite) { throw new InvalidOperationException("Matrix is not positive definite."); } int dimension = L.Rows; int count = rhs.Columns; IMapackMatrix B = (IMapackMatrix)rhs.Clone(); double[][] l = L.Array; // Solve L*Y = B; for (int k = 0; k < L.Rows; k++) { for (int i = k + 1; i < dimension; i++) { for (int j = 0; j < count; j++) { B[i, j] -= B[k, j] * l[i][k]; } } for (int j = 0; j < count; j++) { B[k, j] /= l[k][k]; } } // Solve L'*X = Y; for (int k = dimension - 1; k >= 0; k--) { for (int j = 0; j < count; j++) { B[k, j] /= l[k][k]; } for (int i = 0; i < k; i++) { for (int j = 0; j < count; j++) { B[i, j] -= B[k, j] * l[k][i]; } } } return B; }
public IMapackMatrix Solve(IMapackMatrix rhs) { if (rhs.Rows != QR.Rows) throw new ArgumentException("Matrix row dimensions must agree."); if (!IsFullRank) throw new InvalidOperationException("Matrix is rank deficient."); // Copy right hand side int count = rhs.Columns; IMapackMatrix X = rhs.Clone(); int m = QR.Rows; int n = QR.Columns; double[][] qr = QR.Array; // Compute Y = transpose(Q)*B for (int k = 0; k < n; k++) { for (int j = 0; j < count; j++) { double s = 0.0; for (int i = k; i < m; i++) s += qr[i][k] * X[i, j]; s = -s / qr[k][k]; for (int i = k; i < m; i++) X[i, j] += s * qr[i][k]; } } // Solve R*X = Y; for (int k = n - 1; k >= 0; k--) { for (int j = 0; j < count; j++) X[k, j] /= Rdiag[k]; for (int i = 0; i < k; i++) for (int j = 0; j < count; j++) X[i, j] -= X[k, j] * qr[i][k]; } return X.Submatrix(0, n - 1, 0, count - 1); }