linalg 1.7.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...

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:3548
Computes the LQ factorization of an M-by-N matrix.
Definition: linalg.f90:3434
Performs the matrix operation: .
Definition: linalg.f90:293
Solves a triangular system of equations.
Definition: linalg.f90:2200
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 3434 of file linalg.f90.


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