DET

Computes the determinant of a rectangular matrix.

Function Return Value

Determinant of matrix A.  This is a scalar for the case where A is rank 2. It is a rank-1 array of determinant values for the case where A is rank 3. (Output)

Required Argument

A — Matrix for which the determinant is to be computed.  This argument must be a rank-2 or rank-3 array that contains a rectangular matrix.  It may be real, double, complex, double complex. (Input)

For rank-3 arrays, each rank-2 array (for fixed third subscript), is a separate ma­trix. In this case, the output is a rank-1 array of determinant values for each problem.

Optional Arguments, Packaged Options

This function uses lin_sol_lsq (see Chapter 1, “Linear Systems”) to compute the QR decomposition of A, and the logarithmic value of det(A), which is exponentiated for the result.

The option and derived type names are given in the following tables:

Option Names for DET

Option Value

?_det_for_lin_sol_lsq

1

 

Name of Unallocated Option Array
to Use for Setting Options

Use

Derived Type

?_det_options(:)

Use when setting options for calls hereafter.

?_options

?_det_options_once(:)

Use when setting options for next call only.

?_options

For a description on how to use these options, see Matrix Optional Data Changes.  See lin_sol_lsq located in Chapter 1, “Linear Systems” for the specific options for this routine.

FORTRAN 90 Interface

DET (A)

Description

Computes the determinant of a rectangular matrix, A. The evaluation is based on the QR decompo­sition,

and k = rank(A). Thus det(A) = s ´ det(R) where s = det(Q) ´ det(P) = ±1.

Even well-con­ditioned matrices can have determinants with values that have very large or very tiny magnitudes. The values may overflow or underflow. For this class of problems, the use of the logarithmic repre­sentation of the determinant found in lin_sol_gen or lin_sol_lsq is required.

Examples

Dense Matrix Example (operator_ex02.f90)

 

      use linear_operators

      implicit none

 

! This is Example 2 for LIN_SOL_GEN using operators and functions.

 

      integer, parameter :: n=32

      real(kind(1e0)) :: one=1e0, err, det_A, det_i

      real(kind(1e0)), dimension(n,n) :: A, inv

 

! Generate a random matrix.

      A = rand(A)

! Compute the matrix inverse and its determinant.

      inv = .i.A; det_A = det(A)

! Compute the determinant for the inverse matrix.

      det_i = det(inv)

! Check the quality of both left and right inverses.

      err = (norm(EYE(n)-(A .x. inv))+norm(EYE(n)-(inv.x.A)))/cond(A)

      if (err <= sqrt(epsilon(one)) .and. abs(det_A*det_i - one) <= &

                 sqrt(epsilon(one))) &

      write (*,*) 'Example 2 for LIN_SOL_GEN (operators) is correct.'

      end 

Parallel Example  (parallel_ex02.f90)

 

      use linear_operators

      use mpi_setup_int

     

      implicit none

 

! This is the equivalent of Parallel Example 2 for .i. and det() with box

! data types, operators and functions.

 

      integer, parameter :: n=32, nr=4

      integer J

      real(kind(1e0)) :: one=1e0

      real(kind(1e0)), dimension(nr) :: err, det_A, det_i

      real(kind(1e0)), dimension(n,n,nr) :: A, inv, R, S

 

! Setup for MPI.

      MP_NPROCS=MP_SETUP()

! Generate a random matrix.

      A = rand(A)

! Compute the matrix inverse and its determinant.

      inv = .i.A; det_A = det(A)

! Compute the determinant for the inverse matrix.

      det_i = det(inv)

! Check the quality of both left and right inverses.

      DO J=1,nr; R(:,:,J)=EYE(N); END DO

 

      S=R; R=R-(A .x. inv); S=S-(inv .x. A)

      err = (norm(R)+norm(S))/cond(A)

      if (ALL(err <= sqrt(epsilon(one)) .and. &

        abs(det_A*det_i - one) <= sqrt(epsilon(one)))&

       .and. MP_RANK == 0) &

        write (*,*) 'Parallel Example 2 is correct.'

 

! See to any error messages and quit MPI.

      MP_NPROCS=MP_SETUP('Final')

 

      end


Visual Numerics, Inc.
Visual Numerics - Developers of IMSL and PV-WAVE
http://www.vni.com/
PHONE: 713.784.3131
FAX:713.781.9260