/// <summary> /// Solves a system of linear equations, <c>A'x = b</c>. /// </summary> /// <param name="input">The right hand side vector, <c>b</c>.</param> /// <param name="result">The left hand side vector, <c>x</c>.</param> public void SolveTranspose(Complex[] input, Complex[] result) { if (input == null) { throw new ArgumentNullException(nameof(input)); } if (result == null) { throw new ArgumentNullException(nameof(result)); } int m2 = S.m2; var x = new Complex[m2]; if (m >= n) { // x(q(0:m-1)) = b(0:m-1) Permutation.Apply(S.q, input, x, n); SolverHelper.SolveUpperTranspose(R, x); // x = R'\x // Apply Householder reflection to x. for (int k = n - 1; k >= 0; k--) { ApplyHouseholder(Q, k, beta[k], x); } // b(0:n-1) = x(p(0:n-1)) Permutation.Apply(S.pinv, x, result, m); } else { // x(0:m-1) = b(p(0:m-1) Permutation.ApplyInverse(S.pinv, input, x, n); // Apply Householder reflection to x. for (int k = 0; k < m; k++) { ApplyHouseholder(Q, k, beta[k], x); } SolverHelper.SolveUpper(R, x); // x = R\x // b(q(0:n-1)) = x(0:n-1) Permutation.ApplyInverse(S.q, x, result, m); } }
/// <summary> /// Solves a system of linear equations, <c>Ax = b</c>. /// </summary> /// <param name="input">The right hand side vector, <c>b</c>.</param> /// <param name="result">The left hand side vector, <c>x</c>.</param> /// <remarks> /// Let A be a m-by-n matrix. If m >= n a least-squares problem (min |Ax-b|) /// is solved. If m < n the underdetermined system is solved. /// </remarks> public override void Solve(double[] input, double[] result) { if (input == null) { throw new ArgumentNullException("input"); } if (result == null) { throw new ArgumentNullException("result"); } var x = new double[S.m2]; if (m >= n) { // x(0:m-1) = b(p(0:m-1) Permutation.ApplyInverse(S.pinv, input, x, m); // Apply Householder reflection to x. for (int k = 0; k < n; k++) { ApplyHouseholder(Q, k, beta[k], x); } SolverHelper.SolveUpper(R, x); // x = R\x // b(q(0:n-1)) = x(0:n-1) Permutation.ApplyInverse(S.q, x, result, n); } else { // x(q(0:m-1)) = b(0:m-1) Permutation.Apply(S.q, input, x, m); SolverHelper.SolveUpperTranspose(R, x); // x = R'\x // Apply Householder reflection to x. for (int k = m - 1; k >= 0; k--) { ApplyHouseholder(Q, k, beta[k], x); } // b(0:n-1) = x(p(0:n-1)) Permutation.Apply(S.pinv, x, result, n); } }
/// <summary> /// Solves a system of linear equations, <c>A'x = b</c>. /// </summary> /// <param name="input">The right hand side vector, <c>b</c>.</param> /// <param name="result">The left hand side vector, <c>x</c>.</param> public void SolveTranspose(Complex[] input, Complex[] result) { if (input == null) { throw new ArgumentNullException(nameof(input)); } if (result == null) { throw new ArgumentNullException(nameof(result)); } var x = this.temp; Permutation.Apply(S.q, input, x, n); // x = Q'*b SolverHelper.SolveUpperTranspose(U, x); // x = U'\x. SolverHelper.SolveLowerTranspose(L, x); // x = L'\x. Permutation.Apply(pinv, x, result, n); // b = P'*x }