linalg 1.8.2
A linear algebra library that provides a user-friendly interface to several BLAS and LAPACK routines.
Loading...
Searching...
No Matches
linalg::lq_factor Interface Reference

Computes the LQ factorization of an M-by-N matrix. More...

Public Member Functions

 lq_factor_no_pivot
 
 lq_factor_no_pivot_cmplx
 

Detailed Description

Computes the LQ factorization of an M-by-N matrix.

Syntax
subroutine lq_factor(real(real64) a(:,:), real(real64) tau(:), optional real(real64) work(:), optional integer(int32) olwork, optional class(errors) err)
subroutine lq_factor(complex(real64) a(:,:), complex(real64) tau(:), optional complex(real64) work(:), optional integer(int32) olwork, optional class(errors) err)
Parameters
[in,out]aOn input, the M-by-N matrix to factor. On output, the elements on and below the diagonal contain the MIN(M, N)-by-N lower trapezoidal matrix L (L is lower triangular if M >= N). The elements above the diagonal, along with the array tau, represent the orthogonal matrix Q as a product of elementary reflectors.
[out]tauA MIN(M, N)-element array used to store the scalar factors of the elementary reflectors.
[out]workAn optional input, that if provided, prevents any local memory allocation. If not provided, the memory required is allocated within. If provided, the length of the array must be at least olwork.
[out]olworkAn optional output used to determine workspace size. If supplied, the routine determines the optimal size for work, and returns without performing any actual calculations.
[in,out]errAn optional errors-based object that if provided can be used to retrieve information relating to any errors encountered during execution. If not provided, a default implementation of the errors class is used internally to provide error handling. Possible errors and warning messages that may be encountered are as follows.
  • LA_ARRAY_SIZE_ERROR: Occurs if tau or work are not sized appropriately.
  • LA_OUT_OF_MEMORY_ERROR: Occurs if local memory must be allocated, and there is insufficient memory available.
Notes
This routine utilizes the LAPACK routine DGELQF (ZGELQF for the complex case).
Usage
The folowing example illustrates the solution of a system of equations using LQ factorization.
program example
use iso_fortran_env, only : real64, int32
use linalg
implicit none
! Variables
real(real64) :: a(3,3), b(3), q(3,3), tau(3), x(3)
integer(int32) :: i
! Build the 3-by-3 matrix A.
! | 1 2 3 |
! A = | 4 5 6 |
! | 7 8 0 |
a = reshape( &
[1.0d0, 4.0d0, 7.0d0, 2.0d0, 5.0d0, 8.0d0, 3.0d0, 6.0d0, 0.0d0], &
[3, 3])
! Build the right-hand-side vector B.
! | -1 |
! b = | -2 |
! | -3 |
b = [-1.0d0, -2.0d0, -3.0d0]
! The solution is:
! | 1/3 |
! x = | -2/3 |
! | 0 |
! Compute the LQ factorization
call lq_factor(a, tau)
! Build L and Q. A is overwritten with L
call form_lq(a, tau, q)
! Solve the lower triangular problem and store the solution in B.
!
! A few notes about this solution noting we've factored A = L * Q.
!
! We then have to solve: L * Q * X = B for X. If we let Y = Q * X, then
! we solve the lower triangular system L * Y = B for Y.
call solve_triangular_system(.false., .false., .true., a, b)
! Now we've solved the lower triangular system L * Y = B for Y. At
! this point we solve the problem: Q * X = Y. Q is an orthogonal matrix;
! therefore, inv(Q) = Q**T. We can solve this by multiplying both
! sides by Q**T:
!
! Compute Q**T * B = X
call mtx_mult(.true., 1.0d0, q, b, 0.0d0, x)
! Display the results
print '(A)', "LQ Solution: X = "
print '(F8.4)', (x(i), i = 1, size(x))
end program
Forms the orthogonal matrix Q from the elementary reflectors returned by the LQ factorization algorit...
Definition linalg.f90:3684
Computes the LQ factorization of an M-by-N matrix.
Definition linalg.f90:3570
Performs the matrix operation: .
Definition linalg.f90:361
Solves a triangular system of equations.
Definition linalg.f90:2316
Provides a set of common linear algebra routines.
Definition linalg.f90:145
The above program produces the following output.
LQ Solution: X =
0.3333
-0.6667
0.0000
See Also

Definition at line 3570 of file linalg.f90.


The documentation for this interface was generated from the following file: