DIAGONALS

Extracts the diagonal terms of a matrix.

Function Return Value

Array containing the diagonal terms of matrix A. It is rank-1 or rank-2 depending on the rank of A. When A is a rank-3 array, the result is a rank-2 array consisting of each separate set of diagonals. (Output)

Required Argument

A — Matrix from which to extract the diagonal. This is a rank-2 or rank-3 array of type real, double, complex, or double complex. The output is a rank-1 or rank-2 array, respectively. (Input)

FORTRAN 90 Interface

DIAGONALS (A)

Description

Extracts a rank-1 array whose values are the diagonal terms of the rank-2 array A. The size of the array is the smaller of the two dimensions of the rank-2 array.

Examples

Dense Matrix Example (operator_ex32.f90)

 

use linear_operators

implicit none

! This is the equivalent of Example 4 (using operators) for LIN_EIG_GEN.

 

integer, parameter :: n=17

real(kind(1d0)), parameter :: one=1d0

real(kind(1d0)), dimension(n,n) :: A, C

real(kind(1d0)) variation(n), eta

complex(kind(1d0)), dimension(n,n) :: U, V, e(n), d(n)

 

! Generate a random matrix.

A = rand(A)

 

! Compute the eigenvalues, left- and right- eigenvectors.

D = EIG(A, W=V); E = EIG(.t.A, W=U)

 

! Compute condition numbers and variations of eigenvalues.

variation = norm(A)/abs(diagonals( U .hx. V))

 

! Now perturb the data in the matrix by the relative factors

! eta=sqrt(epsilon) and solve for values again. Check the

! differences compared to the estimates. They should not exceed

! the bounds.

eta = sqrt(epsilon(one))

C = A + eta*(2*rand(A)-1)*A

D = EIG(C)

 

! Looking at the differences of absolute values accounts for

! switching signs on the imaginary parts.

if (count(abs(d)-abs(e) > eta*variation) == 0) then

write (*,*) 'Example 4 for LIN_EIG_GEN (operators) is correct.'

end if

end