Prev Next

@(@\newcommand{\W}[1]{ \; #1 \; } \newcommand{\R}[1]{ {\rm #1} } \newcommand{\B}[1]{ {\bf #1} } \newcommand{\D}[2]{ \frac{\partial #1}{\partial #2} } \newcommand{\DD}[3]{ \frac{\partial^2 #1}{\partial #2 \partial #3} } \newcommand{\Dpow}[2]{ \frac{\partial^{#1}}{\partial {#2}^{#1}} } \newcommand{\dpow}[2]{ \frac{ {\rm d}^{#1}}{{\rm d}\, {#2}^{#1}} }@)@
Determinant of a Minor

Syntax
# include <cppad/speed/det_of_minor.hpp>
d = det_of_minor(amnrc)

Inclusion
The template function det_of_minor is defined in the CppAD namespace by including the file cppad/speed/det_of_minor.hpp (relative to the CppAD distribution directory).

Purpose
This template function returns the determinant of a minor of the matrix @(@ A @)@ using expansion by minors. The elements of the @(@ n \times n @)@ minor @(@ M @)@ of the matrix @(@ A @)@ are defined, for @(@ i = 0 , \ldots , n-1 @)@ and @(@ j = 0 , \ldots , n-1 @)@, by @[@ M_{i,j} = A_{R(i), C(j)} @]@ where the functions @(@ R(i) @)@ is defined by the argument r and @(@ C(j) @)@ is defined by the argument c .

This template function is for example and testing purposes only. Expansion by minors is chosen as an example because it uses a lot of floating point operations yet does not require much source code (on the order of m factorial floating point operations and about 70 lines of source code including comments). This is not an efficient method for computing a determinant; for example, using an LU factorization would be better.

Determinant of A
If the following conditions hold, the minor is the entire matrix @(@ A @)@ and hence det_of_minor will return the determinant of @(@ A @)@:
  1. @(@ n = m @)@.
  2. for @(@ i = 0 , \ldots , m-1 @)@, @(@ r[i] = i+1 @)@, and @(@ r[m] = 0 @)@.
  3. for @(@ j = 0 , \ldots , m-1 @)@, @(@ c[j] = j+1 @)@, and @(@ c[m] = 0 @)@.


a
The argument a has prototype
     const std::vector<
Scalar>& a
and is a vector with size @(@ m * m @)@ (see description of Scalar below). The elements of the @(@ m \times m @)@ matrix @(@ A @)@ are defined, for @(@ i = 0 , \ldots , m-1 @)@ and @(@ j = 0 , \ldots , m-1 @)@, by @[@ A_{i,j} = a[ i * m + j] @]@

m
The argument m has prototype
     size_t 
m
and is the number of rows (and columns) in the square matrix @(@ A @)@.

n
The argument n has prototype
     size_t 
n
and is the number of rows (and columns) in the square minor @(@ M @)@.

r
The argument r has prototype
     std::vector<size_t>& 
r
and is a vector with @(@ m + 1 @)@ elements. This vector defines the function @(@ R(i) @)@ which specifies the rows of the minor @(@ M @)@. To be specific, the function @(@ R(i) @)@ for @(@ i = 0, \ldots , n-1 @)@ is defined by @[@ \begin{array}{rcl} R(0) & = & r[m] \\ R(i+1) & = & r[ R(i) ] \end{array} @]@ All the elements of r must have value less than or equal m . The elements of vector r are modified during the computation, and restored to their original value before the return from det_of_minor.

c
The argument c has prototype
     std::vector<size_t>& 
c
and is a vector with @(@ m + 1 @)@ elements This vector defines the function @(@ C(i) @)@ which specifies the rows of the minor @(@ M @)@. To be specific, the function @(@ C(i) @)@ for @(@ j = 0, \ldots , n-1 @)@ is defined by @[@ \begin{array}{rcl} C(0) & = & c[m] \\ C(j+1) & = & c[ C(j) ] \end{array} @]@ All the elements of c must have value less than or equal m . The elements of vector c are modified during the computation, and restored to their original value before the return from det_of_minor.

d
The result d has prototype
     
Scalar d
and is equal to the determinant of the minor @(@ M @)@.

Scalar
If x and y are objects of type Scalar and i is an object of type int, the Scalar must support the following operations:
Syntax Description Result Type
Scalar x default constructor for Scalar object.
x = i set value of x to current value of i
x = y set value of x to current value of y
x + y value of x plus y Scalar
x - y value of x minus y Scalar
x * y value of x times value of y Scalar

Example
The file det_of_minor.cpp contains an example and test of det_of_minor.hpp. It returns true if it succeeds and false otherwise.

Source Code
The file det_of_minor.hpp contains the source for this template function.
Input File: cppad/speed/det_of_minor.hpp